Log4j 学习笔记

Log4j 学习笔记,第1张

Log4j 学习笔记 1. 快速入门

 public class log4jL {
     public static void main(String[] args) {
         //1 初始化 用于没有配置文件
         BasicConfigurator.configure();
 ​
         //2 生成logger对象
         Logger logger = Logger.getLogger(log4jL.class);
 ​
         //3 日志信息输出
         logger.info("test");
     }
 }

从快速入门的案例中可以学到 配置一个日志信息至少需要三步

初始化 读取配置文件

生成 Logger 对象

输出日志信息

接下来由这三个步骤开始讲述


2. 配置信息 2.1 配置文件类型

首先进入Logger类 找到getLogger()

   public
   Logger getLogger(Class clazz) {
     return LogManager.getLogger(clazz.getName());
   }

可以看到有一个LoggerManager的对象,点进这个loggerManager类中可以看到Log4j的配置信息以及加载管理方式。

 ​
   
   static public final String DEFAULT_CONFIGURATION_FILE = "log4j.properties";
   
   static final String DEFAULT_XML_CONFIGURATION_FILE = "log4j.xml";  
    
   
   static final public String DEFAULT_CONFIGURATION_KEY="log4j.configuration";
 ​
   
   static final public String CONFIGURATOR_CLASS_KEY="log4j.configuratorClass";
 ​
   
   public static final String DEFAULT_INIT_OVERRIDE_KEY = 
                                                  "log4j.defaultInitOverride";
 ​

可以看到 Log4j的配置文件支持上面几种

log4j.properties (过时

log4j.xml

log4j.configuration (过时

log4j.configuratorClass(过时

log4j.defaultInitOverride(过时

但是我还是用properties 比较方便

在这个类的108行可以看到这些配置文件都是由Loader.getResource的方式加载的,所以只需要将配置文件放在resource的文件夹中即可以被识别到。

2.2 配置文件内容
  // If we have a non-null url, then delegate the rest of the
  // configuration to the OptionConverter.selectAndConfigure
  // method.
  if(url != null) {
 LogLog.debug("Using URL ["+url+"] for automatic log4j configuration.");
    try {
        OptionConverter.selectAndConfigure(url, configuratorClassName,
    LogManager.getLoggerRepository());
    } catch (NoClassDefFoundError e) {
        LogLog.warn("Error during default initialization", e);
    }
  } else {
 LogLog.debug("Could not find resource: ["+configurationOptionStr+"].");
  }

还是在LogManager类的下方可以看到如果在类加载过程中找到配置文件,则执行OptionConverter.selectAndConfigure()这个函数,进入这个函数

   static
   public
   void selectAndConfigure(URL url, String clazz, LoggerRepository hierarchy) {
    Configurator configurator = null;
    String filename = url.getFile();
 ​
    if(clazz == null && filename != null && filename.endsWith(".xml")) {
      clazz = "org.apache.log4j.xml.DOMConfigurator";
    }
 ​
    if(clazz != null) {
      LogLog.debug("Preferred configurator class: " + clazz);
      configurator = (Configurator) instantiateByClassName(clazz,
                        Configurator.class,
                        null);
      if(configurator == null) {
          LogLog.error("Could not instantiate configurator ["+clazz+"].");
          return;
      }
    } else {
      configurator = new PropertyConfigurator();
    }
 ​
    configurator.doConfigure(url, hierarchy);
   }
 }

在这个函数中,可以看到程序执行的步骤是 识别配置文件的类型 新建一个configurator对象 执行

configurator.doConfigure(url, hierarchy);方法,所以进入这个方法就可以看到配置信息的写法了。由于这个方法是一个抽象的方法,我们需要查看PropertyConfigurator类的具体实现。

进入这个类之后,如果是下载代码源的话,就可以看到非常详细的注释 包括每个参数的作用 配置的方法 还有样例提供,基本上通过阅读这个源码注释就可以完成对配置文件的学习。

2.2.1 RootLogger

定义每个appender的跟输出级别,这里就需要先登记一下日志的输出级别,从上到下递减

fatal 严重错误 影响系统运行

error 错误信息 不影响系统运行

warn 警告信息 可能会发生问题

info 运行信息 数据连接等信息

debug 调试信息 开发中使用

trace 追踪信息 记录查询程序运行

在rootLogger配置中可以配置每一个appender对应的最低日志输出级别 比如在console中输出bebug以上,在文件中输出error以上的日志级别

 # 表示在console输出tarce级别以上的日志信息
 # 格式为  级别,名称
 # 例子
 log4j.rootLogger=trace,console 

2.2.1.1 自定义logger

设定根logger是遵照所有logger对象的默认配置 自定义logger可以配置某一个logger的个性设置

 
protected String encoding;


protected QuietWriter qw;

2.2.2.2 FileAppender

FileAppender 可以设置的变量为下图。

protected String fileName = null;


protected boolean bufferedIO = false;


protected int bufferSize = 8*1024;

以下是例子

log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%15.15t] %-5p %l %x - %m%n
# 设置文件的路径 这个文件会在你该程序的根目录下作为基路径 算是一种绝对路径的格式
log4j.appender.file.file=/Doc/logs/log4j.log
log4j.appender.file.encoding=UTF-8

同时 FileAppender还发展出了RollingFileAppender、DailyRollingFileAppender 日常使用的话一般使用这两个,这样可以将日志文件分批管理。

RollingFileAppender有两个参数设置的文件的大小和备份数量,同样也可以在配置文件中配置。

protected long maxFileSize = 10*1024*1024;


protected int  maxBackupIndex  = 1;
public
void setMaxFileSize(String value) {
  maxFileSize = OptionConverter.toFileSize(value, maxFileSize + 1);
}

在设置文件大小的时候有着这样一个函数,可以自动帮我们把文件大小转化为系统可以识别的大小,比如你写10MB,它可以自动转化为10 * 1024 * 1024,方便用户 *** 作,具体的转换类型就是在toFileSize这文件里面。


2.2.3 Appender.Layout

配置完Appender之后,还需要配置对应的输出格式

EnhancedPatternLayout

HTMLLayout

PatternLayout

SimpleLayout

TTCCLayout

log4j.appender.appenderName.layout=fully.qualified.name.of.layout.class

2.2.3.1 PatternLayout

在PropertyConfigrator类中 在介绍这个PatternLayout的时候,提供了一个ConversionPattern参数,表示我们可以通过配置信息,自己配置pattern的格式

public final static String DEFAULT_CONVERSION_PATTERN ="%m%n";

PatternLayout 默认的格式 记录

其中 该类提供了一个方法给我们设置 Pattern的格式

 
public
void setConversionPattern(String conversionPattern) {
  pattern = conversionPattern;
  head = createPatternParser(conversionPattern).parse();
}

于是,要想设置自己的Pattern 格式,也只需要在配置文件里面配置,以下是源码给的样例。

在PatternLayout源码上方也提供了很多格式可供参考,既提供了各个参数的含义,也提供了几个常用格式。

log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %c{2} %M.%L %x - %mn
2.3 内置日志记录

找到这个功能的原因是在阅读LogManager源码的时候发现,在LogManager找到的识别url之后要输出的识别记录 ,但是实际运行过程中并没有看到这些信息的输出,于是进入LogLog类查看原因,发现了这个内置日志记录的功能。

LogManager 使用到LogLog的代码

  // If we have a non-null url, then delegate the rest of the
  // configuration to the OptionConverter.selectAndConfigure
  // method.
  if(url != null) {
 LogLog.debug("Using URL ["+url+"] for automatic log4j configuration.");
    try {
        OptionConverter.selectAndConfigure(url, configuratorClassName,
      LogManager.getLoggerRepository());
    } catch (NoClassDefFoundError e) {
        LogLog.warn("Error during default initialization", e);
    }
  } else {
 LogLog.debug("Could not find resource: ["+configurationOptionStr+"].");
  }
} else {
    LogLog.debug("Default initialization of overridden by " + 
        DEFAULT_INIT_OVERRIDE_KEY + "property."); 
}  

发现LogLog类是用于记录Log状态的代码

 

LogManager使用的段落为

public
static
void debug(String msg) {
  if(debugEnabled && !quietMode) {
    System.out.println(PREFIX+msg);
  }
}

默认情况下的这两个参数都为false

protected static boolean debugEnabled = false;  


private static boolean quietMode = false

只需要将debugEnabled设置为true即可.

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5706696.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存