Logback failafe to console logging

时间:2012-05-28 21:05:13

标签: java logging logback

我正在迁移旧应用程序以使用回溯,在此过程中我试图保持所有旧功能以相同的方式工作。遗留应用程序做的一件事是如果无法写入日志文件(由于空间不足,权限不好等),请登录控制台

使用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
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

状态消息可以由任何组件生成,而不仅仅是appender。状态消息没有与之关联的记录器,因此您无法获取状态消息的记录器。顺便说一句,logback实现了从I / O错误中的正常恢复。例如,如果磁盘已满,则logback将停止记录,并在磁盘上有可用空间时自动再次开始记录。请注意,过渡期间发生的日志记录事件将丢失。