logback:两个appender,多个记录器,不同级别 [英] logback: Two appenders, multiple loggers, different levels

查看:785
本文介绍了logback:两个appender,多个记录器,不同级别的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在我的应用程序(Spring Integration),debug.log和main.log中有两个日志文件。我想在INFO级别运行main.log,在DEBUG级别运行debug.log。这对于appender上的过滤器是可行的。我想根据源记录不同级别的appender。换句话说,

 < logger name =org.springframeworklevel =ERROR> 
< appender-ref ref =main/>
< / logger>
< logger name =org.springframeworklevel =DEBUG>
< appender-ref ref =debug/>
< / logger>
< logger name =com.myapplevel =INFO>
< appender-ref ref =main/>
< / logger>
< logger name =com.myapplevel =DEBUG>
< appender-ref ref =debug/>
< / logger>

总结一下:


  1. Spring记录器

    • main - > ERROR

    • debug - > DEBUG


  2. com.myapp logger

    • main - > INFO

    • debug - > DEBUG


因此我必须让记录器在DEBUG上运行并达到阈值过滤器上的过滤器不够精细。<​​/ p>

更新增加问题的清晰度

解决方案

创建一个ThresholdLoggerFilter类,它可以放在一个appender上:

 < appender name =STDOUTclass =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;

公共类ThresholdLoggerFilter扩展Filter< ILoggingEvent> {
私人等级;
private String logger;

@Override
public FilterReply决定(ILoggingEvent事件){
if(!isStarted()){
返回FilterReply.NEUTRAL;
}

if(!event.getLoggerName()。startsWith(logger))
return FilterReply.NEUTRAL;

if(event.getLevel()。isGreaterOrEqual(level)){
return FilterReply.NEUTRAL;
} else {
返回FilterReply.DENY;
}
}

public void setLevel(级别级别){
this.level = level;
}

public void setLogger(String logger){
this.logger = logger;
}

public void start(){
if(this.level!= null&& this.logger!= null){
super.start ();
}
}
}


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:

  1. Spring logger
    • main -> ERROR
    • debug -> DEBUG
  2. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆