天啦撸!打印日志竟然只晓得 Log4j? (3)

3)配置日志信息的格式,语法如下所示:

log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class  
log4j.appender.appenderName.layout.option1 = value1  
…  
log4j.appender.appenderName.layout.option = valueN

Log4j 提供的格式有下面 4 种:

org.apache.log4j.HTMLLayout:HTML 表格

org.apache.log4j.PatternLayout:自定义

org.apache.log4j.SimpleLayout:包含日志信息的级别和信息字符串

org.apache.log4j.TTCCLayout:包含日志产生的时间、线程、类别等等信息

自定义格式的参数如下所示:

%m:输出代码中指定的消息

%p:输出优先级

%r:输出应用启动到输出该日志信息时花费的毫秒数

%c:输出所在类的全名

%t:输出该日志所在的线程名

%n:输出一个回车换行符

%d:输出日志的时间点

%l:输出日志的发生位置,包括类名、线程名、方法名、代码行数,比如:method:com.itwanger.Log4jDemo.main(Log4jDemo.java:14)

第三步,写个使用 Demo:

package com.itwanger;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

/**
 * @author 微信搜「沉默王二」,回复关键字 PDF
 */

public class Log4jDemo {
    private static final Logger logger = LogManager.getLogger(Log4jDemo.class);

    public static void main(String[] args) {
        // 记录debug级别的信息
        logger.debug("debug.");

        // 记录info级别的信息
        logger.info("info.");

        // 记录error级别的信息
        logger.error("error.");
    }
}

1)获取 Logger 对象

要使用 Log4j 的话,需要先获取到 Logger 对象,它用来负责日志信息的打印。通常的格式如下所示:

private static final Logger logger = LogManager.getLogger(Log4jDemo.class);

2)打印日志

有了 Logger 对象后,就可以按照不同的优先级打印日志了。常见的有以下 4 种:

Logger.debug() ;  
Logger.info() ;  
Logger.warn() ;  
Logger.error() ;

程序运行后会在 target 目录下生成两个文件,一个名叫 debug.log,内容如下所示:

2020-10-20 20:53:27  [ main:0 ] - [ DEBUG ]  debug.
2020-10-20 20:53:27  [ main:3 ] - [ INFO ]  info.
2020-10-20 20:53:27  [ main:3 ] - [ ERROR ]  error.

另外一个名叫 error.log,内容如下所示:

2020-10-20 20:53:27  [ main:3 ] - [ ERROR ]  error.
05、打印日志的 8 个小技巧

1)在打印 DEBUG 级别的日志时,切记要使用 isDebugEnabled()!那小伙伴们肯定非常好奇,为什么要这样做呢?

先来看一下 isDebugEnabled() 方法的源码:

  public
  boolean isDebugEnabled() 
{
    if(repository.isDisabled( Level.DEBUG_INT))
      return false;
    return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());
  }

内部使用了 isDisabled() 方法进行了日志级别的判断,如果 DEBUG 是禁用的话,就 return false 了。

再来看一下 debug() 方法的源码:

  public
  void debug(Object message) 
{
    if(repository.isDisabled(Level.DEBUG_INT))
      return;
    if(Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {
      forcedLog(FQCN, Level.DEBUG, message, null);
    }
  }

咦,不是也用 isDisabled() 方法判断吗?难道使用 isDebugEnabled()不是画蛇添足吗?直接用 logger.debug() 不香吗?我来给小伙伴们解释下。

如果我们在打印日志信息的时候需要附带一个方法去获取参数值,就像下面这样:

logger.debug("用户名是:" + getName());

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsssgx.html