我和LogBack一起工作,我有几个伐木工。我已经创建了一个自定义附录:
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文件中,我以侦听器的身份创建了这个附录
<!--Custom Listener Appender-->
<appender name="LISTENER" class="path.to.LogListenerAppender"/>还有一些Logger:
<logger name="TestLogger">
<appender-ref ref="LISTENER" />
</logger>
<logger name="MainLogger">
<appender-ref ref="LISTENER" />
</logger>在代码中,我将LogListener添加到日志中:
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?
我的想法是为每一个记录器创建附件,例如:
<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...但我希望它存在一个更简单的方法
发布于 2019-02-19 10:58:51
您可以在下面的代码中看到这种情况发生的原因:
(LogListenerAppender)log.getAppender("LISTENER");= LogListenerAppender appender
您的代码只获取您在内存中创建的带有引用“侦听器”的任何附录。该列表中的所有侦听器都将从带有侦听器标记的附录中侦听任何事件。
也许尝试将字符串添加到add listener方法中,如下所示:
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")检索适当的追加器的方法。
选择适当的参考文献也是值得的,即;
<logger name="TestLogger">
<appender-ref ref="TEST" />
</logger>
<logger name="MainLogger">
<appender-ref ref="MAIN" />
</logger>为了可读性和可维护性,但这是一个风格选择,而不是一个技术决策
https://stackoverflow.com/questions/54764301
复制相似问题