カスタムLogback Appenderの作成
1. 前書き
この記事では、カスタムLogbackアペンダーの作成について説明します。 Javaでのロギングの概要をお探しの場合は、this articleをご覧ください。
Logbackには、標準出力、ファイルシステム、またはデータベースに書き込む多くの組み込みアペンダーが付属しています。 このフレームワークのアーキテクチャの美しさはモジュール性にあります。つまり、簡単にカスタマイズできます。
このチュートリアルでは、logback-classicに焦点を当てます。これには、次のMaven依存関係が必要です。
ch.qos.logback
logback-classic
1.2.3
この依存関係の最新バージョンはMaven Centralで利用できます。
2. ベースログバックアペンダー
Logbackは、カスタムアペンダーを作成するために拡張できる基本クラスを提供します。
Appenderは、すべてのアペンダーが実装する必要のある汎用インターフェースです。 ジェネリック型は、logback-classicとlogback-accessのどちらを使用しているかに応じて、それぞれILoggingEventまたはAccessEventのいずれかになります。
Our custom appender should extend eitherAppenderBaseorUnsynchronizedAppenderBase, は、Appenderを実装し、フィルターやステータスメッセージなどの機能を処理します。
AppenderBaseはスレッドセーフです。 UnsynchronizedAppenderBaseサブクラスは、スレッドセーフを管理する責任があります。
ConsoleAppenderとFileAppenderの両方がOutputStreamAppenderを拡張し、スーパーメソッドsetOutputStream()を呼び出すように、thecustom appender should subclassOutputStreamAppenderif it is writing to anOutputStream。
3. カスタムアペンダー
カスタムの例では、MapAppenderという名前のおもちゃのアペンダーを作成します。 このアペンダーは、すべてのログイベントをキーのタイムスタンプとともにConcurrentHashMapに挿入します。 まず、AppenderBaseをサブクラス化し、ジェネリック型としてILoggingEventを使用します。
public class MapAppender extends AppenderBase {
private ConcurrentMap eventMap
= new ConcurrentHashMap<>();
@Override
protected void append(ILoggingEvent event) {
eventMap.put(System.currentTimeMillis(), event);
}
public Map getEventMap() {
return eventMap;
}
}
次に、MapAppenderがログイベントの受信を開始できるようにするには、構成ファイルlogback.xmlにアペンダーとして追加しましょう。
4. プロパティの設定
Logbackは、JavaBeansイントロスペクションを使用して、アペンダーに設定されたプロパティを分析します。 カスタムアペンダーには、イントロスペクターがこれらのプロパティを見つけて設定できるようにするためのgetterおよびsetterメソッドが必要です。
eventMapにキーのプレフィックスを与えるプロパティをMapAppenderに追加しましょう。
public class MapAppender extends AppenderBase {
//...
private String prefix;
@Override
protected void append(ILoggingEvent event) {
eventMap.put(prefix + System.currentTimeMillis(), event);
}
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
//...
}
次に、構成にプロパティを追加して、このプレフィックスを設定します。
test
//...
5. エラー処理
カスタムアペンダーの作成および構成中のエラーを処理するために、AppenderBaseから継承されたメソッドを使用できます。
たとえば、プレフィックスプロパティがnullまたは空の文字列の場合、MapAppenderはaddError()を呼び出して、早期に返すことができます。
public class MapAppender extends AppenderBase {
//...
@Override
protected void append(final ILoggingEvent event) {
if (prefix == null || "".equals(prefix)) {
addError("Prefix is not set for MapAppender.");
return;
}
eventMap.put(prefix + System.currentTimeMillis(), event);
}
//...
}
構成でデバッグフラグをオンにすると、プレフィックスプロパティが設定されていないことを警告するエラーがコンソールに表示されます。
//...
6. 結論
このクイックチュートリアルでは、Logbackのカスタムアペンダーを実装する方法に焦点を当てました。
いつものように、例はover on Githubで見つけることができます。