Joh*_*ley 51 java logging logback
我想在我的应用程序(Spring Integration),debug.log和main.log中有两个日志文件.我想在INFO级别运行main.log,在DEBUG级别运行debug.log.这对于appender上的过滤器是可行的.我想根据源记录不同级别的appender.换一种说法
<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>
Run Code Online (Sandbox Code Playgroud)
总结一下:
因此,我必须让记录器在DEBUG上运行,并且在appender上的阈值过滤器不够精细.
更新添加了问题的清晰度
Joh*_*ley 52
创建一个ThresholdLoggerFilter类,可以放在一个appender上:
<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>
Run Code Online (Sandbox Code Playgroud)
以下代码有效
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
art*_*tol 17
如果您愿意从根记录器继承,也可以更简单地执行此操作,例如,此处我们添加了一个额外的记录器来记录错误,并记录到stderr.它仅适用于特定记录器.
<configuration>
<appender name="CONSOLE-stdout" class="ch.qos.logback.core.ConsoleAppender">
<target>System.out</target>
<encoder>
<pattern>%d %-5level [%thread] %logger{0}: %msg%n</pattern>
</encoder>
</appender>
<appender name="CONSOLE-stderr" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<target>System.err</target>
<encoder>
<pattern>%d %-5level [%thread] %logger{0}: %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="CONSOLE-stdout" />
</root>
<!-- We want error logging from this logger to go to an extra appender
It still inherits CONSOLE-stdout from the root logger -->
<logger name="org.springframework" level="INFO">
<appender-ref ref="CONSOLE-stderr" />
</logger>
</configuration>
Run Code Online (Sandbox Code Playgroud)
这些解决方案都不适合我,因为我没有使用Spark或Spring这样的框架。所以我做了一些简单的事情,看起来似乎很好用。尽管此解决方案可能不适用于OP,但对于想要不那么笨重的东西的人来说可能有用。
<property name="pattern" value="%d{yyyy.MMM.dd HH:mm:ss.SSS} [ProgramName] %level - %msg%n" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>/path/to/your/program.log</file>
<append>true</append>
<encoder>
<pattern>${pattern}</pattern>
</encoder>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<target>System.out</target>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>${pattern}</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT" />
</root>
Run Code Online (Sandbox Code Playgroud)
通过这种配置,我可以在将DEBUG语句输出到日志文件的同时保持控制台的整洁。
刚刚找到了一个仅使用 logback 元素的实用解决方案,效果很好,基本上你需要有两个 appender,一个带有默认配置,另一个带有过滤器(在我的示例中,我使用的是控制台):
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="WARN_FILTER_STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="org.apache.spark" level="INFO" additivity="false">
<appender-ref ref="SPARK" /><!-- this line is not necessary, just here to ilustrate the need for the filter -->
<appender-ref ref="WARN_FILTER_STDOUT" />
</logger>
<root level="info">
<appender-ref ref="STDOUT" />
</root>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
69556 次 |
| 最近记录: |