昨天看了log4j2的Appender,今天来看一下Logger。
<Loggers><Rootlevel="debug"><AppenderRefref="Console"/><AppenderRefref="debug_appender"/><AppenderRefref="error_appender"/></Root><Loggername="DOMAIN-DIGEST"additivity="false"level="${log_level}"><AppenderRefref="Console"/><AppenderRefref="error_appender"/></Logger></Loggers>
Logger元素用来定义一个日志输出器,指定logger的设置,在xml中配置在Loggers标签里。我们可以在代码中获取此Logger的实例来选择哪些日志输出到对应的Logger。
常见的有两种:
Root
Logger
Root就是默认的根Logger,也是一个特殊的Logger,是所有logger的根,其他所有的logger都会直接或者间接地继承自root。比如一个name为org.apache.commons的logger会继承name为org.apache的logger,这就是默认的继承机制。
属性:
additivity: 取值为"true"(默认)或者"false",是否继承父logger的属性。如果想要不遵循默认的继承机制,可以使用additivity="false"来配置。
level:定义该logger的日志级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.其中FATAL级别最高,TRACE级别最低。
提示:
root logger可以用Logger.getRootLogger()方法获取,但是不能通过Logger.getLogger("root")获得。
在代码中,我们可以获取对应Logger的实例来选择日志的输出,比如获name为com.xing的Logger,可以这么获取:
privatefinalstaticLoggerlog=LoggerFactory.getLogger("com.xing");
这里log就是name为"com.xing"的Logger的实例,log就可以指定多个appender来输出到不同的地方。
下面看下日志的级别:level
OFF(关闭)
FATAL(致命的)
ERROR(错误)
WARN(警告)
INFO(信息)
DEBUG (调试)
ALL(所有)
输出日志的策略由此Level决定,例如:如果logger的Level设置为INFO,那么系统只输出INFO以及以上(WARN、ERROR、FATAL)信息。
级别也是会遵循继承机制的,如果当前logger没有设定Level,它会使用它继承的Logger的Level作为它自己的Level来处理。如果它的上级也没有设置Level,那么就找上上级,几次类推,直到root为止,(root的Level是不能设为空的,所以最终一定会找到一个Level)。默认root的Level是INFO,其他logger的Level默认都是null,需要手动指定。
在开发中,我们如何将日志打印到不同的地方呢?
publicstaticLoggerinfoLogger=Logger.getLogger("DOMAIN-DIGEST"); publicstaticLoggererrorLogger=Logger.getLogger("error.logger");
只要如上获取不同的logger实例就可以了。
官方推荐使用AsyncLogger 来实现异步:
两种异步:全局异步和混合异步。
全局异步就是,所有日志都异步的记录,也有两种实现方式:
第一种在配置文件上不用做任何改动,只需要添加一个 log4j2.component.properties 配置到 resources:
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
第二种JVM启动参数(boot.ini)加上:
“-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector”
混合异步就是log4j2.xml配置文件中使用AsyncRoot/AsyncLogger替代Root/Logger
例如:
<Loggers><!--自定义logger对象includeLocation="false"关闭日志记录的行号信息,开启的话会严重影响异步输出的性能additivity="false"不再继承rootlogger对象--><AsyncLoggername="com.xing"level="trace"includeLocation="false"additivity="false"><AppenderRefref="Console"/></AsyncLogger><Rootlevel="debug"><!--指定日志输出到控制台--><AppenderRefref="Console"/><!--Async的Appender使用异步的方式输出--><AppenderRefref="Async"/></Root></Loggers>
总结:
Logger用来选择实例去记录日志,有一个根Logger叫Root,可以自定义很多的Logger,他们默认有继承关系,可以使用additivity属性阻断。可以使用异步来优化性能!
END