1. 去官方下载log4j 2,导入jar包,基本上你只需要导入下面两个jar包就可以了(xx是版本号):
log4j-core-xx.jar
log4j-api-xx.jar
2. 或者maven引入:
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.4.1</version>
</dependency>
</dependencies>
3. 在某个类中使用log4j记录日志,只需要申明下面的成员变量:
private static Logger logger = LogManager.getLogger(MyApp.class.getName());
这里getLogger有一个参数指定的是这个logger的名称,这个名称在配置文件里面可是有需要的,这个待会儿再说。
声明了Logger对象,我们就可以在代码中使用他了。
4.配置文件
log4j是apache的一个开源项目,首先需要注意的是,log4j 2.x与以往的1.x有一个明显的不同,其配置文件只能采用.xml, .json或者 .jsn。
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</appenders>
<loggers>
<logger name="hellolog" level="error" additivity="false">
<appender-ref ref="Console"/>
</root>
<root level="error">
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
首先介绍loggers标签,用于定义logger的lever和所采用的appender,其中appender-ref必须为先前定义的appenders的名称,例如,此处为Console。那么log就会以appender所定义的输出格式来输出log。
root标签为log的默认输出形式,如果一个类的log没有在loggers中明确指定其输出lever与格式,那么就会采用root中定义的格式。需要注意的是 additivity选项,如果设置为true(默认值)则hellolog的log会被打印两次,第二次打印是由于hellolog同时也满足root里面定义的error。
5.其他配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
<!--先定义所有的appender-->
<appenders>
<!--这个输出控制台的配置-->
<Console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="trace" 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,则这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>
<!--建立一个默认的root的logger-->
<root level="trace">
<appender-ref ref="RollingFile"/>
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
这里定义了三个appender,Console,File,RollingFile,看意思基本也明白,第二个是写入文件,第三个是“循环”的日志文件,意思是日志文件大于阀值的时候,就开始写一个新的日志文件。
这里我们的配置文件里面的注释算比较详细的了。所以就大家自己看了。有一个比较有意思的是ThresholdFilter ,一个过滤器,其实每个appender可以定义很多个filter,这个功能很有用。如果你要选择控制台只能输出ERROR以上的类别,你就用ThresholdFilter,把level设置成ERROR,onMatch="ACCEPT" onMismatch="DENY" 的意思是匹配就接受,否则直接拒绝,当然有其他选择了,比如交给其他的过滤器去处理了之类的,以后再慢慢琢磨。
Layout配置:
通常,用户不止希望能定义log输出的位置,还希望可以定义输出的格式。这就可以通过将Appender与一个layout相关联来实现。Log4j中定义了一种类似C语言printf函数的打印格式,如"%r [%t] %-5p %c - %m%n" 格式在真实环境下会打印类似如下的信息:
176 [main] INFO org.foo.Bar - Located nearest gas station.
其中,各个字段的含义分别是:
%r 指的是程序运行至输出这句话所经过的时间(以毫秒为单位);
%t 指的是发起这一log request的线程;
%c 指的是log的level;
%m 指的是log request语句携带的message。
%n 为换行符。
6. 一个实用的配置文件:
我们用日志一方面是为了记录程序运行的信息,在出错的时候排查之类的,有时候调试的时候也喜欢用日志。所以,日志如果记录的很乱的话,看起来也不方便。所以我可能有下面一些需求:
1)我正在调试某个类,所以,我不想让其他的类或者包的日志输出,否则会很多内容,所以,你可以修改上面root的级别为最高(或者谨慎起见就用ERROR),然后,加一个针对该类的logger配置,比如第一个配置文件中的设置,把他的level设置trace或者debug之类的,然后我们给一个appender-ref是定义的File那个appender(共三个appender,还记得吗),这个appender的好处是有一个append为false的属性,这样,每次运行都会清空上次的日志,这样就不会因为一直在调试而增加这个文件的内容,查起来也方便,这个和输出到控制台就一个效果了。
2)我已经基本上部署好程序了,然后我要长时间运行了。我需要记录下面几种日志,第一,控制台输出所有的error级别以上的信息。第二,我要有一个文件输出是所有的debug或者info以上的信息,类似做程序记录什么的。第三,我要单独为ERROR以上的信息输出到单独的文件,如果出了错,只查这个配置文件就好了,不会去处理太多的日志,看起来头都大了。怎么做呢,很简单。
>首先,在appenders下面加一个Console类型的appender,通过加一个ThresholdFilter设置level为error。(直接在配置文件的Console这个appender中修改)
>其次,增加一个File类型的appender(也可以是RollingFile或者其他文件输出类型),然后通过设置ThresholdFilter的level为error,设置成File好在,你的error日志应该不会那么多,不需要有多个error级别日志文件的存在,否则你的程序基本上可以重写了。
这里可以添加一个appender,内容如下:
<File name="ERROR" fileName="logs/error.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
并在loggers中的某个logger(如root)中引用(root节点加入这一行作为子节点)
<appender-ref ref="ERROR" />
>然后,增加一个RollingFile的appender,设置基本上同上面的那个配置文件。
>最后,在logger中进行相应的配置。不过如果你的logger中也有日志级别的配置,如果级别都在error以上,你的appender里面也就不会输出error一下的信息了。
7.与spring mvc的整合
maven引入依赖包:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.4.1</version>
</dependency>
web.xml配置:
<context-param>
<param-name>isLog4jAutoInitializationDisabled</param-name>
<param-value>true</param-value>
</context-param>
8.mybatis控制台输出日志
jog4j.xml中加入:
<logger name="log4j.logger.noModule" level="fatal" additivity="false">
<appender-ref ref="Console"/>
</logger>
<logger name="log4j.logger.org.mybatis.jpetstore" level="trace" additivity="false">
<appender-ref ref="Console"/>
</logger>
<logger name="log4j.logger.com.opensymphony.xwork2" level="debug" additivity="false">
<appender-ref ref="Console"/>
</logger>
<logger name="log4j.logger.com.ibatis" level="trace" additivity="false">
<appender-ref ref="Console"/>
</logger>
<logger name="log4j.logger.com.ibatis.common.jdbc.SimpleDataSource" level="debug" additivity="false">
<appender-ref ref="Console"/>
</logger>
<logger name="log4j.logger.com.ibatis.common.jdbc.ScriptRunner" level="debug" additivity="false">
<appender-ref ref="Console"/>
</logger>
<logger name="log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate" level="debug" additivity="false">
<appender-ref ref="Console"/>
</logger>
<logger name="log4j.logger.org.mybatis" level="debug" additivity="false">
<appender-ref ref="Console"/>
</logger>
<logger name="log4j.logger.java.sql" level="debug" additivity="false">
<appender-ref ref="Console"/>
</logger>
<logger name="log4j.logger.java.sql.Connection" level="debug" additivity="false">
<appender-ref ref="Console"/>
</logger>
<logger name="log4j.logger.java.sql.Statement" level="debug" additivity="false">
<appender-ref ref="Console"/>
</logger>
<logger name="log4j.logger.java.sql.PreparedStatement" level="debug" additivity="false">
<appender-ref ref="Console"/>
</logger>
<logger name="log4j.logger.java.sql.ResultSet" level="debug" additivity="false">
<appender-ref ref="Console"/>
光有这个配置是不行滴,因为mybatis加载日志组件是有顺序的,他会按
SLF4J
Apache Commons Logging
Log4j 2
Log4j
JDK logging
的顺序查找。所以,如果在web应用中用了spring之类的框架,他会包含commons-log包,根据优先级,他就不会去用log4j了,所以还得在mybatis配置文件中配置一条语句,如下:
<settings>
<setting name="logImpl" value="LOG4J2"/>
</settings>
本文章参考文章: http://www.cnblogs.com/leo-lsw/p/log4j2tutorial.html