`

LogUtil工具类

 
阅读更多

记录: 一个实用的log4jUtil类:

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.Properties;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * <pre>
 * File name : LogUtil.java
 * Created on : 2007-11-2 10:10:01
 * Description : 日志工具类
 * @author Jonathan Wong
 * </pre>
 */
public class LogUtil {

  public static final String LOG4J_PROPERTIES = "log4j.properties";

  public static final String LOG_FOLDER = "log"; //日志目录,系统启动时自动创建

  public static final String ERROR_LOG = "error.log";

  private static Log log;

  private static ThreadLocal<Object> threadFlag = new ThreadLocal<Object>();

  static {
    init();
  }

  /**
   * 初始化
   */
  private static void init() {
    try {
      createLogFolder();
      redirectSystemErrInfo();
      info("LogUtil initialized!");
    }
    catch(Throwable t) {
      warn("System error info redirect failed!");
    }
  }

  /*
   * 创建日志文件目录
   */
  private static void createLogFolder() {
    File logFolder = new File(LOG_FOLDER);
    boolean isLogFolderCreated = logFolder.mkdir();
    if(isLogFolderCreated)
      info(LOG_FOLDER + " folder created! " + logFolder.getAbsolutePath());
  }

  /*
   * 将系统错误信息重定向到文件
   * 这里文件主要记录的是运行时非预期的异常。
   */
  private static void redirectSystemErrInfo() throws Throwable {
    Properties properties = new Properties();
    properties.load(LogUtil.class.getClassLoader().getResourceAsStream(LOG4J_PROPERTIES));
    String errLogFileName = properties.getProperty(ERROR_LOG);
    PrintStream oldErrPS = System.err;
    PrintStream errPS = createNewErrPS(errLogFileName, oldErrPS);
    System.setErr(errPS);
    info("Redirect SystemErrInfo successfully!");
  }

  private static PrintStream createNewErrPS(String errLogFileName, final PrintStream oldErrPS) throws Throwable {
    return new PrintStream(new FileOutputStream(errLogFileName)) {
      @Override
      public void println(String x) {
        super.println(x);
        oldErrPS.println(x);
      }

      @Override
      public void println(Object x) {
        super.println(x);
        oldErrPS.println(x);
      }
    };
  }

  /*
   * 取得日志实例
   * @return
   */
  private synchronized static Log getLog() {
    if(log == null)
      log = LogFactory.getLog(LogUtil.class);
    return log;
  }

  /**
   * 严重错误(1/6)
   * 非常严重的错误,导致系统中止。
   * @param msg
   */
  public static void fatal(Object msg) {
    getLog().fatal(constructMsg(msg));
  }

  /**
   * 非预期的运行时错误(2/6)
   * 其它运行期错误或不是预期的条件。
   * @param msg
   */
  public static void error(Object msg) {
    getLog().error(constructMsg(msg));
  }

  /**
   * 警告(3/6)
   * 使用了不赞成使用的API、非常拙劣使用API, '几乎就是'错误, 其它运行时不合需要和不合预期的状态但还没必要称为 "错误"。
   * @param msg
   */
  public static void warn(Object msg) {
    getLog().warn(constructMsg(msg));
  }

  /**
   * 一般信息(4/6)
   * 运行时产生的有意义的事件。
   * @param msg
   */
  public static void info(Object msg) {
    getLog().info(constructMsg(msg));
  }

  /**
   * 调试信息(5/6)
   * 系统流程中的细节信息,一般正常运行时不被打印。
   * @param msg
   */
  public static void debug(Object msg) {
    getLog().debug(constructMsg(msg));
  }

  /**
   * 更细节的调试信息(6/6)
   * 比debug更加细节的信息,一般正常运行时不被打印。
   * @param msg
   */
  public static void trace(Object msg) {
    getLog().trace(constructMsg(msg));
  }

  /**
   * 一般捕获的异常信息
   * 所有捕获到的异常务必调用此方法处理,无需 e.printStackTrace() 。
   * @param e
   */
  public static void exception(Exception e) {
    exception(e.getMessage(), e);
  }

  public static void exception(Object msg, Exception e) {
    getLog().info(constructExceptionMsg(msg), e);
  }

  /*
   * 构造异常日志信息
   */
  private static String constructExceptionMsg(Object msg) {
    return constructMsg("Exception:" + String.valueOf(msg));
  }

  /*
   * 构造完整的日志信息
   */
  private static String constructMsg(Object msg) {
    StringBuffer cMsg = new StringBuffer();
    //1.DEBUG 模式下的附加信息
    constructMsgForDebug(cMsg);
    //2.添置FLAG标记下的附加信息
    constructMsgForFlag(cMsg);
    //3.主体信息
    cMsg.append(msg);
    return cMsg.toString();
  }

  @SuppressWarnings("unchecked")
  private static void constructMsgForDebug(StringBuffer cMsg) {
    if(getLog().isDebugEnabled()) {
      try {
        Class locationInfoCls = Class.forName("org.apache.log4j.spi.LocationInfo");
        Object locationInfo = locationInfoCls.getConstructor(Throwable.class, String.class).newInstance(new Throwable(), LogUtil.class.getName());
        cMsg.append("[");
        cMsg.append(locationInfoCls.getMethod("getClassName", (Class [])null).invoke(locationInfo, (Object [])null));
        cMsg.append(":");
        cMsg.append(locationInfoCls.getMethod("getLineNumber", (Class [])null).invoke(locationInfo, (Object [])null));
        cMsg.append("] ");
      }
      catch(Exception e) {
        warn("Could not log with line number and class name, maybe org.apache.log4j.spi.LocationInfo not found!");
        exception(e);
      }
    }
  }

  private static void constructMsgForFlag(StringBuffer cMsg) {
    Object flag = threadFlag.get();
    if(flag != null) {
      cMsg.append("( ");
      cMsg.append(flag);
      cMsg.append(" ) ");
    }
  }

  /**
   * 释放当前线程日志标记
   */
  public static void releaseFlag() {
    threadFlag.remove();
  }

  /**
   * 给当前线程日志创建一个标记
   * @param flag
   */
  public static void setFlag(Object flag) {
    threadFlag.set(flag);
  }
  
  public static boolean isDebugEnabled() {
    return getLog().isDebugEnabled();
  }
  
  public static boolean isTraceEnabled() {
    return getLog().isTraceEnabled();
  }
  
  public static Log getLog(Class clazz) throws Exception {
    return LogFactory.getLog(clazz);
  }

  public static Log getLog(String name) throws Exception {
    return LogFactory.getLog(name);
  }  
}

 

 

分享到:
评论

相关推荐

    推荐一款封装各种Util工具类,这款神仙级框架你值得拥有!.docx

    7. 日志记录:Hutool 的 LogUtil 工具类提供了日志记录的功能,能够自动识别日志实现的日志门面。 8. 脚本执行:Hutool 的 ScriptUtil 工具类提供了脚本执行的功能,例如执行 Javascript 代码。 9. 设置配置:...

    可以控制Log开关的工具类LogUtil

    `LogUtil`是一个常见的自定义工具类,用于方便地管理和控制应用程序中的日志输出。它可以帮助开发者更加灵活地控制日志的开关,避免在发布版本中打印过多的日志信息,从而提高应用性能并保护敏感数据的安全。下面...

    Android中可以控制Log开关的工具类LogUtil

    `LogUtil`就是这样一个工具类,它能够帮助开发者在开发和发布阶段方便地管理日志的输出。 `LogUtil`通常包含以下功能: 1. **开关控制**:`LogUtil`会有一个全局的开关变量,例如`DEBUG`,用于控制是否开启日志...

    android工具类 26个实用工具类

    22. **Log工具类**:如`LogUtil`,提供定制化的日志打印功能,便于调试。 23. **地理位置工具类**:如`LocationUtil`,获取和处理GPS或网络位置信息。 24. **权限请求工具类**:如`RxPermissions`,结合RxJava进行...

    Java 日志工具 LogUtil 源码 不依赖第三方jar包

    Java日志工具LogUtil是Java开发中常见的自定义日志工具类,它的主要特点是不依赖任何第三方的日志框架,如Log4j、Logback或SLF4J等。这种独立性使得开发者在某些特定场景下,例如轻量级应用、嵌入式系统或者对依赖...

    Android快速开发系列 10个常用工具类 程序源码

    5. **LogUtil**: 日志打印工具类,用于调试和追踪代码运行过程。它可以自定义日志级别,标签,以及是否显示堆栈跟踪信息,帮助开发者更好地理解程序运行状态。 6. **ViewUtil**: 视图操作工具类,包含了诸如查找...

    Android高级应用源码-Android开发的日记打印工具类Log4jForAndroid和LogUtil.zip

    `Log4jForAndroid`和`LogUtil`是两个常见的日志工具类,它们扩展了Android原生的日志系统,提供了更强大、更灵活的日志记录功能。下面将详细探讨这两个工具类以及它们在Android开发中的应用。 首先,`Log4j`是Java...

    Android史上最全工具类

    4. **LogUtil**:自定义的日志打印工具类,可以定制日志级别、添加标签,方便调试和分析程序运行状态。 5. **NetWorkUtil**:网络状态检测工具类,检查网络连接是否可用,区分WIFI和移动数据,有助于在网络不稳定时...

    android工具类

    在Android开发过程中,工具类(Util Classes)是程序员经常使用的代码模块,它们包含了各种实用功能,可以帮助开发者更高效地编写代码。"android工具类"这个主题涵盖了从UI操作到网络请求,再到数据处理等多个方面的...

    自己收集整理的一些常用的工具类

    LogUtil LogUti工具类 ArrayUtils 数组工具类,提供一些有关数组的便捷方法 ByteUtils 字节工具类,提供一些有关字节的便捷方法 CheckAdapter 选择适配器 CheckingUtils 提供常用数据验证的工具类,不符合的话就抛...

    Android代码-Android开发的日记打印工具类Log4jForAndroid和LogUtil.rar

    `Log4jForAndroid`和`LogUtil`是两个常见的日志工具类,它们帮助开发者以更高效、更有序的方式记录应用程序运行时的信息。本篇文章将深入探讨这两个工具类,并提供如何在Android项目中使用它们的相关知识。 首先,`...

    安卓开发框架工具类相关-一些工具类.rar

    8. **日志打印工具类**:为了调试和追踪问题,开发者常会自定义日志打印工具类,如LogUtil,支持打印不同的日志级别,并可配置开关,便于在正式发布时关闭日志输出。 9. **异常处理工具类**:用于捕获和处理全局的...

    安卓日志分析崩溃拦截相关-Android开发的日记打印工具类Log4jForAndroid和LogUtil.rar

    本压缩包文件主要包含了一个基于Log4j的Android日志打印工具类`Log4jForAndroid`和一个自定义的日志工具类`LogUtil`,它们都是为了提升日志记录和分析的效率和质量。 首先,`Log4jForAndroid`是Log4j的一个移植版本...

    提取xutil的logutil轻量高效

    这个工具类提供了轻量级且高效的日志打印功能,使得开发者可以在不增加过多性能负担的情况下,获取到项目运行的详细信息。 描述中提到"使用方法和xutil一样",意味着logutil可能采用了与xutil库相似的API设计,便于...

    Android快速开发系列 10个常用工具类

    在Android应用开发中,工具类(Utils类)是开发者经常使用的辅助代码集合,它们封装了各种通用功能,以便在项目中方便地复用。在这个"Android快速开发系列"中,我们将探讨10个非常实用的工具类,这些工具类可以帮助...

    直接拿过来用的工具类

    假设我们有一个`LogUtil`工具类,包含静态方法`logInfo(String tag, String msg)`,用于打印日志。在代码中,我们可以直接这样使用: ```java LogUtil.logInfo("MainActivity", "App启动"); ``` 这样不仅减少了...

    LogUtil记录机器生产状态log的类C#编写

    标题为“LogUtil记录机器生产状态log的类C#编写”的项目,就是这样一个专门用于记录生产环境数据的日志类库。 首先,`LogUtil`类通常会包含一系列静态方法,这些方法用于在不同的事件或条件下记录信息。例如,它...

    android保存log到本地的工具类

    总结,`LogUtil`工具类的创建使得日志管理更加方便,不仅能够实时查看日志,还可以将重要的日志信息持久化到本地,便于后续分析和排查问题。在实际项目中,可以根据需求对这个工具类进行扩展,提升开发效率和问题...

Global site tag (gtag.js) - Google Analytics