我正在迁移旧应用程序以使用回溯,在此过程中我试图保持所有旧功能以相同的方式工作。遗留应用程序做的一件事是如果无法写入日志文件(由于空间不足,权限不好等),请登录控制台
使用logback似乎StatusListener应该处理这个,我可以使用getOrigin来获取筛选的appender,但是我无法弄清楚如何让logger与原始appender相关联。有可能吗?
logback.xml:
<statusListener class="com.example.LogStatusListener"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>WARNING: %logger is only being logged to CONSOLE!%n%msg%n</pattern>
</encoder>
</appender>
<appender name="FILE-SIMPLE" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator class="com.example.CustomDiscriminator"/>
<sift>
<appender name="FILE-${logfile}" class="ch.qos.logback.core.rolling.FileAppender">
<file>${logfile}.log</file>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
</sift>
</appender>
<logger name="debug">
<appender-ref ref="FILE-SIMPLE" />
</logger>
监听器:
public class LogStatusListener implements StatusListener {
@Override
public void addStatusEvent(Status status) {
if (status instanceof ErrorStatus) {
System.err.println(status);
if (status.getOrigin() instanceof Appender) {
Appender origin = (Appender) status.getOrigin();
if (!origin.isStarted()) {
// find the logger associated with origin, and add ConsoleAppender
}
}
}
}
}
答案 0 :(得分:2)
状态消息可以由任何logback组件生成,而不仅仅是appender。状态消息没有与之关联的记录器,因此您无法获取状态消息的记录器。顺便说一句,logback实现了从I / O错误中的正常恢复。例如,如果磁盘已满,则logback将停止记录,并在磁盘上有可用空间时自动再次开始记录。请注意,过渡期间发生的日志记录事件将丢失。