1概要
Logback は、Java Communityで最も広く使用されているロギングフレームワークの1つです。 Log4j に代わるものです。LogbackはLog4jよりも高速な実装を提供し、設定のためのより多くのオプションを提供し、古いログファイルをより柔軟にアーカイブできます。
この紹介では、Logbackのアーキテクチャを紹介し、それを使用してアプリケーションをより良くする方法を説明します。
2ログバックアーキテクチャ
Logbackアーキテクチャは3つのクラスで構成されています。 Logger 、 Appender 、および Layout 。
ロガーはログメッセージのコンテキストです。これは、アプリケーションがログメッセージを作成するために対話するクラスです。
アペンダはログメッセージを最終的な送信先に配置します。ロガーは複数のアペンダを持つことができます。私たちは通常、アペンダーはテキストファイルに添付されていると考えていますが、それよりもログバックの方がはるかに強力です。
レイアウトはメッセージを出力用に準備します。 Logbackはメッセージをフォーマットするためのカスタムクラスの作成と既存のもののための堅牢な設定オプションをサポートします。
3セットアップ
3.1. Mavenの依存関係
Logbackは、Java(SLF4J)用の簡易ロギングファサードをネイティブインタフェースとして使用します。メッセージのロギングを開始する前に、LogbackとSlf4jを pom.xml に追加する必要があります。
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.8.0-beta2</version>
<scope>test</scope>
</dependency>
Maven Centralのhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22ch.qos.logback%22%20AND%20a%3A%22logback-core%22[latestバージョンは[Logback Core]およびhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.slf4j%22%20AND%20a%3A%22slf4j-api%22 slf4j-api ]。
3.2. クラスパス
ログバックでは、ランタイムのクラスパスにhttps://search.maven.org/classic/#search%7Cga%7C1%7Clogback-classic[ logback-classic.jar ]も必要です。
テストの依存関係として、これを pom.xml に追加します。
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
4.基本的な例と設定
アプリケーションでLogbackを使用する簡単な例から始めましょう。
まず、設定ファイルが必要です。 logback.xml という名前のテキストファイルを作成し、クラスパスのどこかに配置します。
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS}[%thread]%-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
次に、 main メソッドを持つ単純なクラスが必要です。
public class Example {
private static final Logger logger
= LoggerFactory.getLogger(Example.class);
public static void main(String[]args) {
logger.info("Example log from {}", Example.class.getSimpleName());
}
}
このクラスは Logger を作成し、 info() を呼び出してログメッセージを生成します。
Example を実行すると、メッセージがコンソールに記録されます。
20:34:22.136[main]INFO Example - Example log from Example
Logbackがとても人気がある理由は簡単にわかります。数分で稼働します。
この設定とコードは、これがどのように機能するかについていくつかのヒントを与えてくれます。
-
クラス名を参照する __appender named STDOUT__があります.
ConsoleAppender. 。ログメッセージの形式を記述するパターンがあります。
-
私たちのコードは Logger を作成し、私たちはそれを通して私たちのメッセージを渡しました
info() メソッド _. _
基本を理解できたので、もう少し詳しく見てみましょう。
5ロガーコンテキスト
5.1. コンテキストを作成する
Logbackにメッセージを記録するために、SLF4JまたはLogbackからの Logger を初期化しました。
private static final Logger logger
= LoggerFactory.getLogger(Example.class);
そしてそれを使った:
logger.info("Example log from {}", Example.class.getSimpleName());
これがロギングのコンテキストです。それを作成したとき、私たちは LoggerFactory をクラスに渡しました。これは Logger に名前を与えます(__Stringを受け付けるオーバーロードもあります)。
ロギングコンテキストは、Javaオブジェクト階層とよく似た階層にあります。
-
** ロガーの名前の後にドットが続くと、その前にaが付きます
子孫ロガーの名前 。 ロガーとの間に先祖がいない場合、ロガーは親
子**
たとえば、以下の Example クラスは com.baeldung.logback パッケージにあります。 com.baeldung.logback.appenders パッケージには、 ExampleAppender という別のクラスがあります。
ExampleAppender’s Logger は、__Example’s Loggerの子です。
-
すべてのロガーは事前定義されたルートロガーの子孫です。
Logger には Levelがあり、これは設定によって、または Logger.setLevel()で設定できます。コードでレベルを設定すると、設定ファイルが上書きされます。
可能なレベルは、優先順位の高い順です。 TRACE、DEBUG、INFO、WARN 、および _ERROR . _ 各レベルには、そのレベルでメッセージを記録するために使用する対応するメソッドがあります。
-
ロガーが明示的にレベルを割り当てられていない場合、それは最も近い先祖のレベルを継承します** ルートロガーはデフォルトで__DEBUGになります。
5.2. コンテキストを使う
ロギング階層内でコンテキストを使用する方法を示すプログラム例を作成しましょう。
ch.qos.logback.classic.Logger parentLogger =
(ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.baeldung.logback");
parentLogger.setLevel(Level.INFO);
Logger childlogger =
(ch.qos.logback.classic.Logger)LoggerFactory.getLogger("com.baeldung.logback.tests");
parentLogger.warn("This message is logged because WARN > INFO.");
parentLogger.debug("This message is not logged because DEBUG < INFO.");
childlogger.info("INFO == INFO");
childlogger.debug("DEBUG < INFO");
これを実行すると、次のメッセージが表示されます。
20:31:29.586[main]WARN com.baeldung.logback - This message is logged because WARN > INFO.
20:31:29.594[main]INFO com.baeldung.logback.tests - INFO == INFO
まず com.baeldung.logback という名前の Logger を取得し、それを ch.qos.logback.classic.Logger. にキャストします。
次の文でレベルを設定するには、Logbackコンテキストが必要です。 SLF4Jの抽象ロガーは__setLevel()を実装していません。
コンテキストのレベルを INFO に設定し、次に com.baeldung.logback.tests. という別のロガーを作成します。
階層を示すために、コンテキストごとに2つのメッセージを記録します。
Logbackは WARN、 、および INFO メッセージをログに記録し、 _ DEBUG _ メッセージをフィルタリングします。
それでは、ルートロガーを使用しましょう。
ch.qos.logback.classic.Logger logger =
(ch.qos.logback.classic.Logger)LoggerFactory.getLogger("com.baeldung.logback");
logger.debug("Hi there!");
Logger rootLogger =
(ch.qos.logback.classic.Logger)LoggerFactory.getLogger(org.slf4j.Logger.ROOT__LOGGER__NAME);
logger.debug("This message is logged because DEBUG == DEBUG.");
rootLogger.setLevel(Level.ERROR);
logger.warn("This message is not logged because WARN < ERROR.");
logger.error("This is logged.");
このスニペットを実行すると、これらのメッセージが表示されます。
20:44:44.241[main]DEBUG com.baeldung.logback - Hi there!
20:44:44.243[main]DEBUG com.baeldung.logback - This message is logged because DEBUG == DEBUG.
20:44:44.243[main]ERROR com.baeldung.logback - This is logged.
結論として、私たちは Logger コンテキストから始めて DEBUG メッセージを出力しました。
次に、静的に定義された名前を使ってルートロガーを取得し、そのレベルを__ERRORに設定しました
そして最後に、Logbackは実際にはエラーより少ない文をフィルタリングします。
5.3. パラメータ化されたメッセージ
上記のサンプルスニペットのメッセージとは異なり、最も有用なログメッセージには__Stringsを追加する必要がありました。
次のようなメッセージを考えます。
log.debug("Current count is " + count);
Loggerがメッセージをログに記録するかどうかにかかわらず、メッセージを作成するコストがかかります。
Logbackは、パラメータ化されたメッセージで代替手段を提供します。
log.debug("Current count is {}", count);
中括弧\ {}は任意の Object を受け入れ、ログメッセージが必要であることを確認した後でのみメッセージを作成するためにその toString() メソッドを使用します。
いくつかの異なるパラメータを試してみましょう。
String message = "This is a String";
Integer zero = 0;
try {
logger.debug("Logging message: {}", message);
logger.debug("Going to divide {} by {}", 42, zero);
int result = 42/zero;
} catch (Exception e) {
logger.error("Error dividing {} by {} ", 42, zero, e);
}
このスニペットは次のようになります。
21:32:10.311[main]DEBUG com.baeldung.logback.LogbackTests - Logging message: This is a String
21:32:10.316[main]DEBUG com.baeldung.logback.LogbackTests - Going to divide 42 by 0
21:32:10.316[main]ERROR com.baeldung.logback.LogbackTests - Error dividing 42 by 0
java.lang.ArithmeticException:/by zero
at com.baeldung.logback.LogbackTests.givenParameters__ValuesLogged(LogbackTests.java:64)
...
String、 int、 、および Integer__をパラメーターとして渡す方法がわかります。
また、 Exception がロギングメソッドの最後の引数として渡されると、Logbackはスタックトレースを表示します。
** 6. 詳細な設定
前の例では、コンソールにログメッセージを出力するために section 4 で作成した11行の設定ファイルを使用していました。これはLogbackのデフォルトの動作です。設定ファイルが見つからない場合は、 __ConsoleAppender __を作成し、それをルートロガーに関連付けます。
6.1. 設定情報の場所
構成ファイルはクラスパスに配置し、 logback.xml または__logback-test.xmlのいずれかの名前を付けることができます。
Logbackが設定データを見つける方法は次のとおりです。
-
_logback-test.xml、logback.groovy、 _ という名前のファイルを検索します.
クラスパス内の logback.xml 、この順序で。
-
ライブラリがそれらのファイルを見つけられない場合は、使用を試みます
Javaの ServiceLoader の実装者を探す com.qos.logback.classic.spi.Configurator. 。コンソールに直接ログを出力するように設定する
注:現在のバージョンのLogbackは、Java 9と互換性のあるバージョンのGroovyがないため、Groovy構成をサポートしません。
6.2. 基本構成
私たちのリンクを詳しく見てみましょう:#example[設定例]
ファイル全体が _ <configuration> _ タグにあります。
-
ConsoleAppender 型の Appender を宣言し、それに STDOUT という名前のタグがあります。そのタグ内にネストされているのはエンコーダです。これは sprintf-style エスケープコードのようなパターンのパターンを持っています:**
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS}[%thread]%-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
最後に、 root タグがあります。このタグは、ルートロガーを DEBUG モードに設定し、その出力を STDOUT という Appender に関連付けます。
<root level="debug">
<appender-ref ref="STDOUT"/>
</root>
6.3. 設定のトラブルシューティング
ログバック構成ファイルは複雑になる可能性があるため、トラブルシューティングのための組み込みメカニズムがいくつかあります。
Logbackが設定を処理しているときにデバッグ情報を表示するには、デバッグログを有効にします。
<configuration debug="true">
...
</configuration>
Logbackは設定を処理するときにステータス情報をコンソールに表示します。
23:54:23,040 |-INFO in ch.qos.logback.classic.LoggerContext[default]- Found resource[logback-test.xml]
at[file:/Users/egoebelbecker/ideaProjects/logback-guide/out/test/resources/logback-test.xml]23:54:23,230 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender
of type[ch.qos.logback.core.ConsoleAppender]23:54:23,236 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as[STDOUT]23:54:23,247 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type
[ch.qos.logback.classic.encoder.PatternLayoutEncoder]for[encoder]property
23:54:23,308 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
23:54:23,309 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named[STDOUT]to Logger[ROOT]23:54:23,310 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
23:54:23,313 |-INFO in[email protected]- Registering current configuration
as safe fallback point
設定ファイルの解析中に警告またはエラーが発生した場合、Logbackはステータスメッセージをコンソールに書き込みます。
ステータス情報を印刷するための2番目のメカニズムがあります。
<configuration>
<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener"/>
...
</configuration>
-
StatusListener は設定中およびプログラムの実行中にステータスメッセージをインターセプトして表示します** 。
すべての構成ファイルからの出力が印刷されるため、クラスパス上の「不正な」構成ファイルを見つけるのに便利です。
6.4. 設定を自動的に再読み込みする
アプリケーションの実行中にロギング設定をリロードすることは、強力なトラブルシューティングツールです。 Logbackは scan パラメータでこれを可能にします。
<configuration scan="true">
...
</configuration>
デフォルトの動作では、60秒ごとに設定ファイルの変更をスキャンします。 scanPeriod を追加してこの間隔を変更します。
<configuration scan="true" scanPeriod="15 seconds">
...
</configuration>
ミリ秒、秒、分、または時間で値を指定できます。
6.5. Loggers を変更する
上記のサンプルファイルでは、ルートロガーのレベルを設定してコンソール _Appender _ に関連付けました。
任意のロガーのレベルを設定できます。
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS}[%thread]%-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="com.baeldung.logback" level="INFO"/>
<logger name="com.baeldung.logback.tests" level="WARN"/>
<root level="debug">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
これをクラスパスに追加して、次のコードを実行しましょう。
Logger foobar =
(ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.baeldung.foobar");
Logger logger =
(ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.baeldung.logback");
Logger testslogger =
(ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.baeldung.logback.tests");
foobar.debug("This is logged from foobar");
logger.debug("This is not logged from logger");
logger.info("This is logged from logger");
testslogger.info("This is not logged from tests");
testslogger.warn("This is logged from tests");
私達はこの出力を見ます:
00:29:51.787[main]DEBUG com.baeldung.foobar - This is logged from foobar
00:29:51.789[main]INFO com.baeldung.logback - This is logged from logger
00:29:51.789[main]WARN com.baeldung.logback.tests - This is logged from tests
プログラムでLoggerのレベルを設定しないことで、設定はそれらを設定します。 com.baeldung.foobar は、ルートロガーから _ DEBUG _ ** を継承しています。
ロガー もルートロガーから appender-ref を継承します。以下で見るように、これを上書きすることができます。
6.6. 可変置換
ログバック設定ファイルは変数をサポートします。設定スクリプトの内部または外部で変数を定義します。変数は、値の代わりに設定スクリプト内の任意の時点で指定できます。
たとえば、以下は FileAppender の設定です。
<property name="LOG__DIR" value="/var/log/application"/>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${LOG__DIR}/tests.log</file>
<append>true</append>
<encoder>
<pattern>%-4relative[%thread]%-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
設定の先頭で、 _ LOG DIR . _ という名前の property を宣言しました。次に、それを appender__定義内のファイルへのパスの一部として使用しました。
プロパティは設定スクリプトの <property> タグで宣言されています。
しかし、それらはシステムプロパティなどの外部ソースからも入手できます。この例では property 宣言を省略し、コマンドラインで LOG DIR__の値を設定できます。
$ java -DLOG__DIR=/var/log/application com.baeldung.logback.LogbackTests
Logbackは変数をテキスト置換として実装しています。変数置換は、値を指定できる構成ファイル内の任意の時点で発生する可能性があります。
7. アペンダー
Loggers は LoggingEvents を Appendersに渡します。 Appenders はロギングの実際の作業を行います。私たちは通常ログをファイルやコンソールに行くものと考えていますが、ログバックはもっと多くのことが可能です。 Logback-core はいくつかの便利なアペンダを提供します。
7.1. ConsoleAppender
__ConsoleAppender の動作を確認しました。その名前にもかかわらず、 ConsoleAppender は System.out または System.err.__にメッセージを追加します。
I/Oをバッファするために OutputStreamWriter が使用されているため、 System.err に転送してもバッファリングされない書き込みは発生しません。
7.2. FileAppender
_FileAppender _ はファイルにメッセージを追加します。幅広い構成パラメータをサポートしています。ファイルアペンダを基本設定に追加しましょう。
<configuration debug="true">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS}[%thread]%-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>tests.log</file>
<append>true</append>
<encoder>
<pattern>%-4relative[%thread]%-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<logger name="com.baeldung.logback" level="INFO"/>
<logger name="com.baeldung.logback.tests" level="WARN">
<appender-ref ref="FILE"/>
</logger>
<root level="debug">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
FileAppender は <file> . を介してファイル名で設定されます。テストを数回実行すると、ログ出力が同じファイルに追加されることがわかります。
上記からテストを再実行すると、 com.baeldung.logback.tests からのメッセージはコンソールとtests.logという名前のファイルの両方に送信されます。 ** 子孫ロガーは、ルートロガーと ConsoleAppender 、および__FileAppenderとの関連付けを継承しています。
この動作を無効にすることができます。
<logger name="com.baeldung.logback.tests" level="WARN" additivity="false" >
<appender-ref ref="FILE"/>
</logger>
<root level="debug">
<appender-ref ref="STDOUT"/>
</root>
additivity を __false に設定すると、デフォルトの動作が無効になります。 Tests__はコンソールにログを記録せず、またその子孫もログに記録しません。
7.3. RollingFileAppender
多くの場合、ログファイルを同じファイルに追加することは、必要な動作ではありません。時間、ログファイルサイズ、またはその両方に基づいてファイルを「ロール」させます。
このために、__RollingFileAppenderがあります。
<property name="LOG__FILE" value="LogFile"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG__FILE}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>${LOG__FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern>
<!-- keep 30 days' worth of history capped at 3GB total size -->
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%-4relative[%thread]%-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
_RollingFileAppender には RollingPolicyがあります。 この設定例では、 TimeBasedRollingPolicyがあります。 _
__FileAppenderと同様に、このアペンダにファイル名を設定しました。以下のファイル名を再利用するため、プロパティを宣言してこれを使用しました。
_RollingPolicy . の中に fileNamePattern を定義します。このパターンは、ファイルの名前だけでなく、それらをロールする頻度も定義します。 TimeBasedRollingPolicy _ はパターンを調べ、最も詳細に定義された周期でロールします。
例えば:
<property name="LOG__FILE" value="LogFile"/>
<property name="LOG__DIR" value="/var/logs/application"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG__DIR}/${LOG__FILE}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG__DIR}/%d{yyyy/MM}/${LOG__FILE}.gz</fileNamePattern>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
アクティブなログファイルは _/var/logs/application/LogFileです。 このファイルは毎月の初めに _ /今年/今月/LogFile.gzにロールオーバーします。 ** 新しいアクティブファイル
アーカイブファイルの合計サイズが3GBに達すると、 _RollingFileAppender _ は先入れ先出し方式でアーカイブを削除します。
週、時、分、秒、さらにはミリ秒のコードがあります。
Logbackはhttps://logback.qos.ch/manual/appenders.html#TimeBasedRollingPolicyを参照しています。
__RollingFileAppender にはファイル圧縮のサポートも組み込まれています。それらを LogFile.gz.__と名付けたので、それは私たちのロールファイルを圧縮します。
_TimeBasedPolicy がローリングファイルの唯一の選択肢ではありません。 Logbackは SizeAndTimeBasedRollingPolicy、 も提供します。これは現在のログファイルのサイズと時間に基づいてロールされます。ロガーが起動されるたびにログファイル名をロールする FixedWindowRollingPolicy _ も提供します。
独自の__https://logback.qos.ch/manual/appenders.html#onRollingPolicies[RollingPolicy]を書くこともできます。
** 7.4. カスタムアペンダ
Logbackの基本アペンダクラスの1つを拡張することによって、カスタムアペンダを作成できます。カスタムアペンダリンクを作成するためのチュートリアルがあります:/custom-logback-appender[ここ]。
8 レイアウト
レイアウト 形式のログメッセージ。 Logbackの他の部分と同様に、 _Layouts _ は拡張可能で、https://logback.qos.ch/manual/layouts.html#writingYourOwnLayout[自分で作成することができます。それからいくつか。
これまでのすべての例で PatternLayout を使用しました。
<encoder>
<pattern>%d{HH:mm:ss.SSS}[%thread]%-5level %logger{36} - %msg%n</pattern>
</encoder>
この設定スクリプトには、____PatternLayoutEncoderの設定が含まれています。
<pattern> タグ内のテキストは、ログメッセージのフォーマット方法を定義します。 PatternLayout は、パターンを作成するためのさまざまな変換語とフォーマット修飾子を実装しています。
これを分解しましょう。 PatternLayout は変換語を%で認識するので、このパターンの変換は次のようになります。
-
%d \ {HH:mm:ss.SSS} - 時、分、秒、
ミリ秒 ** [%thread] - ログメッセージを生成するスレッド名。
角括弧で ** % - 5level - ロギングイベントのレベル、5文字にパディング
-
%logger \ {36} - ロガーの名前(35文字に切り捨て)
-
%msg%n - ログメッセージとそれに続くプラットフォーム依存行
区切り文字
そのため、これに似たメッセージが表示されます。
21:32:10.311[main]DEBUG com.baeldung.logback.LogbackTests - Logging message: This is a String
変換ワードとフォーマット修飾子の完全なリストはhttps://logback.qos.ch/manual/layouts.html#conversionWord[here]にあります。
9.まとめ
この広範なガイドでは、アプリケーションでLogbackを使用するための基礎について説明しました。
Logbackのアーキテクチャの3つの主要コンポーネントを調べました。
ロガー、アペンダ、そしてレイアウト。 Logbackには強力な設定スクリプトがあり、これを使ってメッセージのフィルタリングとフォーマットのためにコンポーネントを操作していました。また、ログファイルの作成、ロールオーバー、整理、および圧縮に最もよく使用される2つのファイルアペンダを調べました。
いつものように、コードスニペットはhttps://github.com/eugenp/tutorials/tree/master/logging-modules/logback[GitHubに追加]を見つけることができます。