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输出产生该日志事件的线程名

四、示例

<?xml version="1.0" encoding="UTF-8"?>
  <!-- status 查看log4j的日志级别-->
  <configuration status="OFF">
    <!--先定义所有的appender-->
    <appenders>
        <!--输出控制台的配置-->
        <Console name="Console" target="SYSTEM_OUT">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--输出日志的格式-->
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </Console>

        <!-- 文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定 -->
        <File name="log" fileName="log/test.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>

    <!-- 每次大小超过size  每天周期性 作为存档  -->
    <RollingFile name="ROLLING" fileName="d:/logs/howsun.log"
             filePattern="d:/logs/howsun_%d{yyyy-MM-dd}_%i.log">
            <PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/>
      <!-- 复合型触发策略  每天 或  超过50MB -->
            <Policies>
		<!-- 时间策略设置 -->
                <TimeBasedTriggeringPolicy modulate="true" interval="24"/>
		<!-- 文件大小设置 -->
                <SizeBasedTriggeringPolicy size="50MB"/>
            </Policies>
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>

        <!--每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFile" fileName="logs/app.log"
            filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
            <SizeBasedTriggeringPolicy size="50MB"/>
        </RollingFile>
    </appenders>

    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
     <!--我们只让这个logger输出trace信息,其他的都是debug级别-->
	<!--    additivity开启的话,由于这个logger也是满足root的,所以会被打印两遍。
        不过root logger 的level是error,为什么Bar 里面的trace信息也被打印两遍呢     -->
        <logger name="cn.base.logs.Hello" level="trace" additivity="false">
	    <!-- 引入appender -->
            <appender-ref ref="Console"/>
        </logger>

        <!--建立一个默认的root的logger-->
        <root level="debug">
            <appender-ref ref="RollingFile"/>
            <appender-ref ref="Console"/>
        </root>
    </loggers>
</configuration>


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值