我想有两个日志文件在我的应用程序(Spring集成),和的debug.log main.log。 我想在在DEBUG级别的INFO级别和运行的debug.log main.log。 这是可行的与上追加程序的过滤器。 我想登录不同层次的基于源的追加程序。 换一种说法
<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>
因此,要总结:
- 春天记录仪
- com.myapp记录仪
正因为如此我必须处于调试运行记录仪和一个appender阈值滤波器不是足够细颗粒。
更新更加清楚的问题
Answer 1:
创建它可以在一个appender等把ThresholdLoggerFilter类:
<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>
下面的代码工作
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();
}
}
}
Answer 2:
你也可以做这个有点更简单,如果你愿意从根logger继承,比如这里我们添加错误额外的记录,它记录到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>
Answer 3:
添加额外的解决方案,它比简单的是什么已经在这里
这些解决方案都没有工作对我来说,因为我没有使用像Spark或春天的框架。 所以我做了一个简单一点,似乎很好地发挥作用。 虽然这种解决方案可能无法为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>
有了这个配置,我能够保持控制台相当干净,同时输出调试语句到日志文件。
Answer 4:
只是找到了一个切实可行的解决方案使用的logback元素只有工作得很好,基本上你需要有两个附加目的地,一个默认的配置,另一个用的过滤器(在我的例子中,我使用控制台):
<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>
Answer 5:
使用不同的信息多记录器将是这样的:
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.FileAppender;
public class ConfigureLogBack
{
public static void programmaticConfiguration()
{
Logger camel = getLogger("MyRoute", C:\\Users\\amrut.malaji\\Desktop\\Oracle\\logback\\camel-Log.txt");
Logger services = getLogger("webservices", "C:\\Users\\amrut.malaji\\Desktop\\Oracle\\logback\\services-log.txt");
}
private static Logger getLogger(String string, String file) {
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
PatternLayoutEncoder ple = new PatternLayoutEncoder();
ple.setPattern("%date %level [%thread] %logger{10} [%file:%line] %msg%n");
ple.setContext(lc);
ple.start();
FileAppender<ILoggingEvent> fileAppender = new FileAppender<ILoggingEvent>();
fileAppender.setFile(file);
fileAppender.setEncoder(ple);
fileAppender.setContext(lc);
fileAppender.start();
Logger logger = (Logger) LoggerFactory.getLogger(string);
logger.addAppender(fileAppender);
logger.setLevel(Level.INFO);
logger.setAdditive(false); /* set to true if root should log too */
return logger;
}
Answer 6:
在一个appender阈值过滤器是不够的细粒
你可以使用一个EvaluatorFilter。 甲JaninoEventEvaluator需要一个参考JANINO(的.jar)和logback.xml例子是:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
<expression>
level <= ERROR && logger.equals("com.myapp.ThresholdLoggerFilter")
</expression>
</evaluator>
<OnMismatch>DENY</OnMismatch>
<OnMatch>NEUTRAL</OnMatch>
</filter>
</appender>
这种方法使用的表达标签Java表达式(必须是XML转义)来评估记录的事件,不需要定制Java类被写入。
文章来源: logback: Two appenders, multiple loggers, different levels