由于公司内网的开发,需要到存储日志和解析日志等等功能,学习了下log4j框架的使用,然后抓紧时间记录下。maven项目,使用的是springboot框架,少去了一些配置,主要是log4j.properties文件。
为了避免冲突,先除去pom.xml中springboot默认支持的日志框架logback,然后在pom.xml上添加依赖log4j的依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Log4j -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
接下来,只需要在properties中写下自己所需要的配置即可。log4j虽然有好几种级别的日志,但只建议使用恶种级别:debug、info、warn、error。
配置根logger
log4j.rootLogger = info,stdout, pvfile, errorfile
info是指记录的级别为info及info以上的日志,其他的是appender的名称。即[level], appenderName1, appenderNam2…
控制台输出(console)
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d %p [%c] - %m%n
分别为appender创建日志对象,记录目标为System.out,灵活地指定布局模式,日志输出格式
格式化符号说明:
%d:输出日志时间点的日期或时间,也可以自定义日期格式
%p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR
%m:日志内容
%n:换行
定期日志文件(dailyFile,以error为例)
log4j.appender.errorfile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorfile.File = /data2/logs/qidianvip/error/error.log
log4j.appender.errorfile.Append = true
log4j.appender.errorfile.Threshold = ERROR
log4j.appender.errorfile.layout = org.apache.log4j.PatternLayout
log4j.appender.errorfile.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
log4j.appender.errorfile.encoding=GBK
第一行:表示创建每日回滚文件对象
第二行:自定义的日志文件存储路径,这里写的是绝对路径
第三行:表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true
第四行:表示定义输入到文件的日志级别,这里指ERROR和ERROR以上的级别
第六行:
%-d{yyyy-MM-dd HH:mm:ss}:自定的日期格式
[ %t:%r ]:输出产生该日志事件的线程名和自应用程序启动到输出该log信息耗费的毫秒数。我们可以通过自定义日志格式来实现业务需求。
第七行:自定义编码,默认为ISO8601。
注意
有时候,我们需要将日志按级别分别记录在不同文件中,上面的配置只是将定义的日志级别及更高级输出到文件。也就是说如果定义的是INFO级别,那么输出的级别就会是INFO、WARN、ERROR,但这并不能满足我们的需求。以下给出博主的解决方式
第一种,在上面的配置中添加如下配置
log4j.appender.errorfile.filter.F1=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.errorfile.filter.F1.LevelMin=INFO
log4j.appender.errorfile.filter.F1.LevelMax=INFO
这看起来很容易理解,就是给appender添加拦截器,设定最大级别跟最小级别,拦截掉其他的级别的日志信息。
第二种,定义一个class来继承org.apache.log4j.DailyRollingFileAppender来重新实现isAsSevereAsThreshold()方法实现其他级别的过滤。
DailyRollingFileAppender类的isAsSevereAsThreshold()方法源码为
public boolean isAsSevereAsThreshold(Priority priority)
{
return threshold == null || priority.isGreaterOrEqual(threshold);
}
我们只要继承DailyRollingFileAppender类,然后重新实现isAsSevereAsThreshold()来限制级别匹配,如:
import org.apache.log4j.Priority;
import org.apache.log4j.DailyRollingFileAppender;
public class MyDailyRollingFileAppender extends DailyRollingFileAppender{
@Override
public boolean isAsSevereAsThreshold(Priority priority) {
return this.getThreshold().equals(priority);
}
}
然后将log4j.appender.errorfile = org.apache.log4j.DailyRollingFileAppender改为该行配置改为log4j.appender.errorfile = [MyDailyRollingFileAppender类的路径]即可。