2

ログバックを使用するようにレガシーアプリを移行しています。その過程で、古い機能をすべて同じように機能させ続けようとしています。従来のアプリが行ったことの1つは、ログファイルに書き込めなかった場合にコンソールにログを記録することでした(スペースの不足、不正なアクセス許可などが原因)

ログバックを使用すると、StatusListenerがこれを処理する必要があるようです。getOriginを使用して、ふるいにかけられたアペンダーを取得できますが、オリジンアペンダーに関連付けられたロガーを取得する方法がわかりません。出来ますか?

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
                }
            }
        }
    }
}
4

1 に答える 1

2

ステータスメッセージは、だけでなく、任意のログバックコンポーネントによって生成できます。ステータスメッセージにはロガーが関連付けられていないため、ステータスメッセージのロガーを取得することはできません。ちなみに、logbackはI/Oエラーからの適切な回復を実装します。たとえば、ディスクがいっぱいになると、logbackはロギングを停止し、ディスクに空きができると自動的にロギングを再開します。暫定的に発生するロギングイベントは失われることに注意してください。

于 2012-05-29T14:00:57.360 に答える