最近项目需求需要将log4j1.2 升级到log4j2,摸索了好久,得出一点经验给大家分享。

1.log4j2 官网下载最新jar包(目前log2j2都是beta版)

导入入log4j-api-2.0-beta5.jar和log4j-core-2.0-beta5.jar。


2.配置文件

log4j2的配置文件后缀名只能为.xml, .json或者 .jsn,在默认的情况,系统选择configuration文件的优先级如下:

1.classpath下名为 log4j2-test.json 或者log4j2-test.jsn文件

2.classpath下名为log4j2-test.xml

3.classpath下名为 log4j2.json 或者log4j2.jsn文件

4.classpath下名为log4j2.xml

所以建议配置文件为log4j2.xml,下面以此为例:

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
   <Appenders>
   
      <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d [%t] %-5p [%c] - %m%n"/>
      </Console>
          
     <RollingRandomAccessFile name="DebugAppender" fileName="./logs/lsp_admin_debug.log" append="true" filePattern="./logs/lsp_admin_debug.log.%d{yyyyMMdd}">
      <PatternLayout>
        <Pattern>%d %-5p [%c] %m%n</Pattern>
      </PatternLayout>
      <Policies>
        <TimeBasedTriggeringPolicy interval="24" modulate="true"/>
      </Policies>     
      <ThresholdFilter level="INFO"  onMatch="DENY"  onMismatch="ACCEPT"/>
      <ThresholdFilter level="DEBUG" onMatch="ACCEPT"  onMismatch="DENY"/>
    </RollingRandomAccessFile>
           
   <RollingRandomAccessFile  name="FILE" fileName="/opt/lspv2/lsp_app/logs/lsp_app.log" append="true" filePattern="/opt/lspv2/lsp_app/logs/lsp_app.log.%d{yyyyMMdd}">
      <PatternLayout>
        <Pattern>%d %-5p [%c] %m%n</Pattern>
      </PatternLayout>
      <Policies>
        <TimeBasedTriggeringPolicy  interval="24"  modulate="true"/>
      </Policies>
    </RollingRandomAccessFile >
        
    </Appenders>
    
    
    <Loggers>
        <logger name="com.ericsson.lsp.service.sim" level="INFO" additivity="false">     
            <appender-ref ref="Console" />
            <appender-ref ref="FILE" />
            <appender-ref ref="Event.error" />
        </logger>
        <root level="Info">
            <appender-ref ref="Console" />
            <appender-ref ref="DebugAppender" />
        </root>
    </Loggers>
        
</Configuration>

1.首先介绍loggers标签,用于定义logger的lever和所采用的appender,其中appender-ref必须为先前定义的appenders的名称,例如,此处为Console。那么log就会以appender所定义的输出格式来输出log


root标签为log的默认输出形式,如果一个类的log没有在loggers中明确指定其输出lever与格式,那么就会采用root中定义的格式

解析:如上面的例子中,com.ericsson.lsp.service.sim中的所有类,都会按照console和FILE的appender来输出,而没有定义log的类,都按照root默认的来输出。

2.再来介绍下Appenders标签,里面放各种扩展组件,主要类型有

 1.ConsoleAppender

输出结果到控制台

 2.FileAppender

输出结果到指定文件

 3.RollingFileAppender

   同样输出结果到文件,区别是用一个buffer,因此速度会快点。

还有其他的 FlumeAppender,JDBCAppender 等等,但是我们最常用的就是前面三者了。

介绍下RollingRandomessFile 的相关属性:

 name:表示该appender的名称

 fileName:表示输出的文件的路径

 append:是否追加,true表示追加内容到所在的日志,false表示每次都覆盖

filePattern:表示当日志到达指定的大小或者时间,产生新日志时,旧日志的命名路径。

PatternLayout:和log4j1一样,指定输出日志的格式,具体代表的意思见前面的博客中

Policies:策略,表示日志什么时候应该产生新日志,

         可以有时间策略和大小策略等,上面使用的是时间策略,每隔24小时产生新的日志文件

ThresholdFilter :过滤器,log4j2中有很多的filter,但是没有仔细研究,需要的时候再看

         上文中的ThresholdFilter filter 指定了输出的最低级别,如

      将输出debug以及debug级别以上的,但是需求只需要输出debug级别的,所以加上下列filter

 但是,这样的效果是输出debug和info两个级别的日志,所以换下两个filter的顺序就好了。

当然还有许多其他的配置,可以自己到官网查看

http://logging.apache.org/log4j/2.x/manual/appenders.html

3.使用实例

import org.apache.logging.log4j.LogManager;  

import org.apache.logging.log4j.Logger;  

public class Test {  

   private static Logger logger = LogManager.getLogger("HelloWorld");  

   public static void main(String[] args){  

       Test.logger.info("hello,world");  

       Test.logger.error("There is a error here");  

   }  

}  

获取logger换了一种方式,通过logManager获取logger,其他与log4j1一样,正常使用