利用logback 设置不同包下的日志级别

网友投稿 1582 2023-03-04

利用logback 设置不同包下的日志级别

利用logback 设置不同包下的日志级别

1、实现效果:项目的整体的日志打印级别为ERROR,但在某个包下或某个类想打印INFO级别的日志。

2、配置:

FILE是ERROR级别日志打印;

SPECIAL 是INFO级别日志打印;

FILE与SPECIAL唯一不同是日志保存路径不同,其它策略相同;

通过 logger标签指定包路径或类路径并引用SPECIAL;

test

${catalina.home}/logs/test/test.%d.%i.log

30

10MB

%d %p (%file:%line\)- %m%n -[%X{X-B3-TraceId:-},%X{X-B3-SpanId:-}]

UTF-8

30

10MB

%d %p (%file:%line\)- %m%n -[%X{X-B3-TraceId:-},%X{X-B3-SpanId:-}]

UTF-8

%d %p (%file:%line\hWjtAKpX)- %m%n

UTF-8

补充知识:logback框架使用误区 如何将所有包的ERROR级别日志集中打印到一个日志文件中

早就想写这个事情了,起因是自己想写一个东西,其中使用logback日志框架记录日志

打算 将所有包的ERROR及以上级别日志打到一个文件中,各个包下的日志打到对应包的文件中。

起初写的xml配置类似于这样:

all-error.log

${log_dir}/all-error.%d{yyyy-MM-dd}.%i.log

100MB

60

20GB

%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n

然而运行后却发现,这样配置后的,并没有达到预期目标。

反而,所有INFO及以上的信息,不仅在appender appender-1和appender-2对应的日志文件中有,在appender为ALL-ERROR对应的日志文件中也都有,这是为何?

追踪了一下断点,发现如下代码片段:

/**

* Invoke all the appenders of this logger.

*

* @param event

* The event to log

*/

public void callAppenders(ILoggingEvent event) {

int writes = 0;

for (Logger l = this; l != null; l = l.parent) {

writes += l.appendLoopOnAppenders(event);

if (!l.additive) {

break;

}

}

// No appenders in hierarchy

if (writes == 0) {

loggerContext.noAppenderDefinedWarning(this);

}

}

这段代码来自logback的 ch.qos.logback.classic.Logger文件,是最终决定日志内容输出在哪里的代码。

从这段代码我们可以发现:

1. logback会找到第一个符合日志级别要求的logger,然后将日志内容输入到这个logger下配置的appender中。举例来说:如果有一个com.some.package1内的类的INFO级别日志,那么首先会找到logger com.some.package1,然后找到logger下配置的appender appender-1;最后根据appender-1的配置,将日志内容输出到appender-1配置的文件中。

2. 之后,logback根据additivty检查logger是否允许继承,如果配置为true(默认为true),则查找上一级logger(实际是按照以包名为name查找上一层包的logger),找到logger后,不再判断logger配置是否符合日志级别要求,直接找到对应的appender,将日志内容输出。

这就带来了一个问题,位于低层次包的logger,在接收到日志后,不仅会把它输出到自身的appender中,还会将其传递给位于高层次包logger的appender中,无论高层次包logger配置的日志级别是什么。正因为如此,所以我打算将所有包的ERROR级别 日志输出到一个文件的目的没有实现,反而所有INFO及以上级别的日志都输出了。

按照这个思路,如果logger com.some.package1和com.some.package2日记级别为ERROR,而logger com.some日志级别为INFO的话,是否所有INFO及以上级别的日志都可以记入logger com.some对应的appender下,而ERROR及以上级别的日志会记入logger com.some.package1和com.some.package2呢?测试证明,是这样。

知道了为什么上面的配置达不到目的,接下来要考虑的是,借助什么方式实现这个需求呢?

logback提供了实现需求的方式:借助Filter来做:

既然logger无法判断日志级别,那我们可以在对应的appender里判断日志级别。

logback的过滤器使用起来可以达到对每一条日志的DENY、ACCEPT和NEUTRAL。

根据文章开始提出的需求,我们需要的是一个绑定appender的,过滤日志等级的filter,那么ch.qos.logback.classic.filter.ThresholdFilter正好是我们需要的。通过加入如下配置,appender ALL-ERROR将只能接受ERROR及以上的日志:

INFO

完整的xml配置如下,仅改变了filter的部分,就实现了需http://求:

all-error.log

ERROR

${log_dir}/all-error.%d{yyyy-MM-dd}.%i.log

100MB

60

20GB

%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n

更多关于logback的Filter的讲解,请见

1. logback filter文档

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:vue开发vr看房小程序(小程序vr如何实现)
下一篇:Xml中使用foreach遍历对象实现代码
相关文章

 发表评论

暂时没有评论,来抢沙发吧~