logback:两个 appender,多个记录器,不同的级别 [英] logback: Two appenders, multiple loggers, different levels
问题描述
我想在我的应用程序(Spring 集成)中有两个日志文件,debug.log 和 main.log.我想在 INFO 级别运行 main.log,在 DEBUG 级别运行 debug.log.这可以通过 appender 上的过滤器来实现.我想根据源将不同级别记录到附加程序.换句话说
<appender-ref ref="main"/> <logger name="org.springframework" level="DEBUG"><appender-ref ref="debug"/><logger name="com.myapp" level="INFO"><appender-ref ref="main"/><logger name="com.myapp" level="DEBUG"><appender-ref ref="debug"/>
总结一下:
- 弹簧记录器
- 主要 -> 错误
- 调试 -> 调试
- com.myapp 记录器
- 主要 -> 信息
- 调试 -> 调试
因此,我必须让记录器在 DEBUG 下运行,而 appender 上的阈值过滤器不够精细.</p>
更新使问题更加清晰
创建一个 ThresholdLoggerFilter 类,它可以放在像这样的 appender 上:
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>INFO</level></过滤器><filter class="com.myapp.ThresholdLoggerFilter"><logger>org.springframework</logger><level>错误</level></过滤器></appender>
以下代码有效
package com.myapp;导入 ch.qos.logback.classic.Level;导入 ch.qos.logback.classic.spi.ILoggingEvent;导入 ch.qos.logback.core.filter.Filter;导入 ch.qos.logback.core.spi.FilterReply;公共类 ThresholdLoggerFilter 扩展了 Filter{私人级别;私人字符串记录器;@覆盖公共 FilterReply 决定(ILoggingEvent 事件){如果 (!isStarted()) {返回 FilterReply.NEUTRAL;}if (!event.getLoggerName().startsWith(logger))返回 FilterReply.NEUTRAL;如果 (event.getLevel().isGreaterOrEqual(level)) {返回 FilterReply.NEUTRAL;} 别的 {返回 FilterReply.DENY;}}public void setLevel(Level level) {this.level = 级别;}公共无效 setLogger(字符串记录器){this.logger = 记录器;}公共无效开始(){if (this.level != null && this.logger != null) {超级开始();}}}
I want to have two log files in my application (Spring Integration), debug.log and main.log. I want to run main.log at an INFO level and debug.log at a DEBUG level. This is doable with filters on the appenders. I want to log different levels to the appenders based on the source. In other words
<logger name="org.springframework" level="ERROR">
<appender-ref ref="main" />
</logger>
<logger name="org.springframework" level="DEBUG">
<appender-ref ref="debug" />
</logger>
<logger name="com.myapp" level="INFO">
<appender-ref ref="main" />
</logger>
<logger name="com.myapp" level="DEBUG">
<appender-ref ref="debug" />
</logger>
So to summarise:
- Spring logger
- main -> ERROR
- debug -> DEBUG
- com.myapp logger
- main -> INFO
- debug -> DEBUG
Because of this I have to have the loggers running at DEBUG and a threshold filter on an appender isn't fine grained enough.
Update Added clarity to the question
Create a ThresholdLoggerFilter class which can be put on an appender like:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<filter class="com.myapp.ThresholdLoggerFilter">
<logger>org.springframework</logger>
<level>ERROR</level>
</filter>
</appender>
The following code works
package com.myapp;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
public class ThresholdLoggerFilter extends Filter<ILoggingEvent> {
private Level level;
private String logger;
@Override
public FilterReply decide(ILoggingEvent event) {
if (!isStarted()) {
return FilterReply.NEUTRAL;
}
if (!event.getLoggerName().startsWith(logger))
return FilterReply.NEUTRAL;
if (event.getLevel().isGreaterOrEqual(level)) {
return FilterReply.NEUTRAL;
} else {
return FilterReply.DENY;
}
}
public void setLevel(Level level) {
this.level = level;
}
public void setLogger(String logger) {
this.logger = logger;
}
public void start() {
if (this.level != null && this.logger != null) {
super.start();
}
}
}
这篇关于logback:两个 appender,多个记录器,不同的级别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!