log4j2 配置

一、日志级别
每个Logger都被了一个日志级别(log level),用来控制日志信息的输出。日志级别从高到低分为:
A:off 最高等级,用于关闭所有日志记录。
B:fatal 指出每个严重的错误事件将会导致应用程序的退出。
C:error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
D:warm 表明会出现潜在的错误情形。
E:info 一般和在粗粒度级别上,强调应用程序的运行全程。
F:debug 一般用于细粒度级别上,对调试应用程序非常有帮助。
G:all 最低等级,用于打开所有日志记录。
上面这些级别是定义在org.apache.log4j.Level类中。Log4j只建议使用4个级别,优先级从高到低分别是error,warn,info和debug。通过使用日志级别,可以控制应用程序中相应级别日志信息的输出。例如,如果使用了info级别,则应用程序中所有低于info级别的日志信息(如debug)将不会被打印出来。
二、常用配置日志信息输出目的地Appender
(1)ConsoleAppender
  将日志信息输出到控制台
(2)FileAppender
  将日志信息输出到一个文件
  重要的参数:
① fileName,String,指定写入的log文件的名称。
② append,boolean,指定是否是追加写入(append=true,默认情况),还是覆盖写入(append=false)。
③ bufferedIO,boolean,是否对数据进行缓冲到缓冲区满后再写入。测试显示,即使在启用immediateFlush的情况下,设置bufferedIO=true也能提高性能。
④ locking,boolean,是否对文件上锁,当有多个线程可能同时写该文件时需要考虑上锁(在《异常处理反模式》中就提到要把在一起的日志输出语句写到一句,而不是拆成几句来避免并发线程导致的日志语句之间的错位)。但对文件上锁会影响系统的性能,所以需要谨慎使用。默认值是false。
(3)RollingFileAppender
  将日志信息输出到一个文件后,会判断是否满足封存文件的要求,若满足,则除非封存文件的动作。RollingFileAppender需要TriggeringPolicy来指定触发封存的条件,另外还需要RolloverStrategy来告诉输出器如何封存文件。

Log4j2中提供的TriggeringPolicy:
① CompositeTriggeringPolicy
复合型触发策略。即将多个触发条件逻辑或到一起,只要其中一个条件满足,则触发封存动作。
② OnStartup Triggering Policy
这一触发策略不需要参数设置,它会自行判断log文件的创建时间和JVM的启动时间。若log文件的创建时间早于JVM的启动时间,则将原来的log文件封存,然后创建一个新的空白log文件。
③ SizeBased Triggering Policy
这一触发策略基于对log文件大小的判断。当log文件大于设定的阈值时,将触发封存动作。可设定的log文件大小的单位有bytes、KB、MB或GB。
④ TimeBased Triggering Policy
基于时间的触发策略。该策略主要是完成周期性的log文件封存工作。有两个参数:
interval,integer型,指定两次封存动作之间的时间间隔。
modulate,boolean型,说明是否对封存时间进行调制。若modulate=true,则封存时间将以0点为边界进行偏移计算。比如,modulate=true,interval=4hours,那么假设上次封存日志的时间为03:00,则下次封存日志的时间为04:00,之后的封存时间依次为08:00,12:00,16:00


Log4j2中实现的RolloverStrategy为Default Rollover Strategy,它有三个参数可以设置,分别为:
fileIndex,String,有两个选择“max”或“min”。设置为“max”意味着将最新的日志信息封存在序号较大的封存文件中。“min”则相反。
min,integer,封存文件的序号的起始值。
max,integer,封存文件的序号的最大值。(超过最大值时,将有文件被删除)
相当于min和max两个参数设置了一个保存窗口,超出这个窗口的日志文件将会被删除。

三、配置日志信息的输出格式
控制输出的格式,就可通过log4j的layout组件来实现。通过配置文件定义一个appender的输出格式,通常以PatternLayout使用Pattern的方式来指定布局。

  pattern 的参数如下:ConversionPattern参数的格式含义

格式 名 含义
%C 输出日志信息所属的类的全名
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,
比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2002-10-18- 22:10:28 ;
比如 %d{HH:mm:ss,SSS} 或 %d{dd MMM yyyy HH:mm:ss,SSS}.
%F 输出日志信息所属的类的类名
%L 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
%m 输出代码中指定的信息,如log(message)中的message
%M 输出日志信息中所发生的方法名。
%n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n”
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推
%r 输出自应用启动到输出该日志信息所耗费的毫秒数
%t 输出产生该日志事件的线程名

四、示例


  
  
    
    
        
        
            
            
            
            
        

        
        
            
        

    
    
            
      
            
		
                
		
                
            
            
        

        
        
            
            
        
    

    
    
     
	
        
	    
            
        

        
        
            
            
        
    


loggers下面会定义许多个logger,这些logger通过name进行区分,来对不同的logger配置不同的输出,方法是通过引用定义的appender,注意,appender-ref引用的值是上面每个appender的name,而不是节点名称。

   logger的name的机制:

  我们这里看到了配置文件里面是name很重要,没错,这个name可不能随便起(其实可以随便起)。这个机制意思很简单。就是类似于Java package一样,比如我们的一个包:cn.base.logs.。而且,可以发现我们前面生成Logger对象的时候,命名都是通过 Hello.class.getName(); 这样的方法,为什么要这样呢? 很简单,因为有所谓的Logger 继承的问题。比如 如果你给cn.base定义了一个logger,那么他也适用于cn.base.logs这个logger。名称的继承是通过点(.)分隔的。然后你可以猜测上面loggers里面有一个子节点不是logger而是root,而且这个root没有name属性。这个root相当于根节点。所有的logger都适用与这个logger,所以,即使你在很多类里面通过  类名.class.getName()  得到很多的logger,而且没有在配置文件的loggers下面做配置,他们也都能够输出,因为他们都继承了root的log配置。

示例解析:

  上面的这个配置文件里面定义了一个logger,他的名称是 cn.base.logs.Hello ,这个名称其实就是通过Hello.class.getName(); (Java代码生成Logger对象时调用)得到的,我们为了给他单独做配置,就生成对于这个类的logger,上面的配置基本的意思是只有cn.base.logs.Hello 这个logger输出trace信息,也就是他的日志级别是trace,其他的logger则继承root的日志配置,日志级别是debug,只能打印出DEBUG及以上级别的日志。如果这里logger 的name属性改成cn.base,则这个包下面的所有logger都会继承这个log配置(这里的包是log4j的logger name的“包”的含义,不是java的包。但和java包结构相同)


参考资料:

Log4j2 官网

http://blog.csdn.net/lu8000/article/details/25754415


你可能感兴趣的:(日志,logging,log4j2)