这一定是一件简单的事情,但我没有得到它。
我有一个标记,说我在记录时使用的“性能”。此外,当日志消息的构建成本很高时,我经常使用isDebugEnabled()等。
现在我想配置我可以做以下两件事的回溯:
1)记录Logger foo.Bar中所有调试或更高版本的语句并使用标记“performance”
2)记录所有调试或更高版本的Logger中的所有语句,并使用标记“performance”
要实现1)我试过这个:
<turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
<Marker>index-control-flow</Marker>
<OnMatch>ACCEPT</OnMatch>
</turboFilter>
<logger name="foo.Bar" level="DEBUG"/>
然后,所有未使用此标记标记的日志消息也会显示在日志中。
要实现2)我尝试省略上面的记录器行并且只获得带有标记的日志消息,但是,通过检查isDebugEnabled()保护的所有日志消息都被省略。
答案 0 :(得分:1)
在logback-users邮件列表和更多RTFM的帮助下,我得到了它。
将此示例改为此处,
<turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
<Marker>index-control-flow</Marker>
<OnMismatch>DENY</OnMismatch>
</turboFilter>
与isDebugEnabled(Marker)一起设置各个记录器的级别为我提供了1)的解决方案(不完全但足够好)
与OnMatch ACCEPT相同,为我提供了2)
的设置答案 1 :(得分:0)
完成第一步的最佳选择是添加一个实现您的标准的自定义Turbo过滤器。我已经从我的一个Scala过滤器中调整了这个,它做了一些非常相似的事情。
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.turbo.TurboFilter;
import ch.qos.logback.core.spi.FilterReply;
public class ConditionalTurboFilter
extends TurboFilter
{
@Override
public FilterReply
decide(Marker marker,
Logger logger,
Level level,
String format,
Object[] params,
Throwable t)
{
if (marker != targetMarker) {
return FilterReply.DENY;
}
if (!level.isGreaterOrEqual(targetLevel)) {
return FilterReply.DENY;
}
if (targetLogger == null) {
return FilterReply.NEUTRAL;
}
else if (targetLogger != logger.getName()) {
return FilterReply.DENY;
}
return FilterReply.NEUTRAL;
}
void setMarker(String str)
{
if (str != null && str.trim().length() > 0) {
targetMarker = MarkerFactory.getMarker(str);
}
}
void setLevel(String str)
{
if (str != null && str.trim().length() > 0) {
targetLevel = Level.toLevel(str, Level.ALL);
}
}
void setLogger(String logger)
{
targetLogger = logger;
}
@Override
public void
start()
{
if (targetMarker != null && targetLevel != null) {
super.start();
}
}
private Marker targetMarker;
private Level targetLevel;
private String targetLogger;
}
然后使用它,你会这样做:
<turboFilter class="com.yoursite.project.logback.ConditionalTurboFilter">
<Marker>index-control-flow</Marker>
<Level>DEBUG</Level>
<Logger>foo.Bar</Logger>
</turboFilter>