首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >logback创建appender的新实例

logback创建appender的新实例
EN

Stack Overflow用户
提问于 2019-02-19 10:41:54
回答 1查看 1.1K关注 0票数 0

我和LogBack一起工作,我有几个伐木工。我已经创建了一个自定义附录:

代码语言:javascript
复制
public class LogListenerAppender extends AppenderBase<ILoggingEvent> {

    private List<LogListener> listeners;

    public LogListenerAppender() {
        listeners = new ArrayList<>();
    }

    public void addListener(LogListener listener){
        listeners.add(listener);
        System.out.println("Current listener: " + listeners.size());
    }

    /**
     * Send the LogEvent to all Listeners
     * @param eventObject the LogEventObject
     */
    @Override
    protected void append(ILoggingEvent eventObject) {
        for(LogListener listener : listeners){
            listener.receiveLogMessage(eventObject);
        }
    }
}

此附录是将侦听器添加到Logger以捕获日志消息。

现在,在我的logback.xml文件中,我以侦听器的身份创建了这个附录

代码语言:javascript
复制
<!--Custom Listener Appender-->
<appender name="LISTENER" class="path.to.LogListenerAppender"/>

还有一些Logger:

代码语言:javascript
复制
<logger name="TestLogger">
    <appender-ref ref="LISTENER" />
</logger>

<logger name="MainLogger">
    <appender-ref ref="LISTENER" />
</logger>

在代码中,我将LogListener添加到日志中:

代码语言:javascript
复制
public static void main(String[] args){
    Logger testLogger = LoggerFactory.getLogger("TestLogger");
    Logger mainLogger = LoggerFactory.getLogger("MainLogger");

    addListenerToLogger(testLogger, new LogListener(Level.TRACE) {
        @Override
        public void log(String message, long timestamp) {
            System.out.println("TEST LOG: " + message);
        }
    });
    addListenerToLogger(mainLogger, new LogListener(Level.TRACE) {
        @Override
        public void log(String message, long timestamp) {
            System.out.println("MAIN LOG: " + message);
        }
    });
    testLogger.info("Hello");
}

private static void addListenerToLogger(Logger logger, LogListener loglistener){
    ch.qos.logback.classic.Logger log = (ch.qos.logback.classic.Logger) logger;
    LogListenerAppender appender = (LogListenerAppender)log.getAppender("LISTENER");
    appender.addListener(loglistener);
}

期望的输出是:

测试日志: Hello

但产出如下:

测试日志: Hello

主日志:你好

System.out.println("Current listener: " + listeners.size());在LogListenerAppender中打印2。

我现在的问题是,Logback对使用LogListenerAppender的所有Logger都使用相同的实例。

但我需要一个新的LogListenerAppender给每一个Logger。我如何配置他每次创建新实例时创建的logBack?

我的想法是为每一个记录器创建附件,例如:

代码语言:javascript
复制
<appender name="LISTENER1" class="path.to.LogListenerAppender"/>
<appender name="LISTENER2" class="path.to.LogListenerAppender"/>
//etc...
<logger name="TestLogger">
    <appender-ref ref="LISTENER1" />
</logger>

<logger name="MainLogger">
    <appender-ref ref="LISTENER2" />
</logger>
//etc...

但我希望它存在一个更简单的方法

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-19 10:58:51

您可以在下面的代码中看到这种情况发生的原因:

(LogListenerAppender)log.getAppender("LISTENER");= LogListenerAppender appender

您的代码只获取您在内存中创建的带有引用“侦听器”的任何附录。该列表中的所有侦听器都将从带有侦听器标记的附录中侦听任何事件。

也许尝试将字符串添加到add listener方法中,如下所示:

代码语言:javascript
复制
private static void addListenerToLogger(Logger logger, LogListener loglistener, String appenderRef){
    ch.qos.logback.classic.Logger log = (ch.qos.logback.classic.Logger) logger;
    LogListenerAppender appender = (LogListenerAppender)log.getAppender(appenderRef);
    appender.addListener(loglistener);
}

通过这种方式,您可以传递适当的appender (即( "LISTENER1")检索适当的追加器的方法。

选择适当的参考文献也是值得的,即;

代码语言:javascript
复制
<logger name="TestLogger">
    <appender-ref ref="TEST" />
</logger>

<logger name="MainLogger">
    <appender-ref ref="MAIN" />
</logger>

为了可读性和可维护性,但这是一个风格选择,而不是一个技术决策

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54764301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档