springboot下应用log4j实现将不同级别的日志输出到不同文件中

由于公司内网的开发,需要到存储日志和解析日志等等功能,学习了下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类的路径]即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值