logback入門 〜logbackの設定
logbackの設定
https://logback.qos.ch/manual/configuration_ja.html
基本構成
設定ファイルの探索順は以下。
クラスパス上でlogback.groovyというファイルを探します。
見つからなかったら、今度はクラスパス上でlogback-test.xmlを探します。
見つからなかったら、今度はクラスパス上でlogback.xmlを探します。
何も見つからなかったら、自動的にBasicConfiguratorを使って設定。ロギング出力は直接コンソールに出力される。以下と等価。
<configuration> <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> <root level="debug"> <appender-ref ref="STDOUT" /> </root> </configuration>
設定ファイルが変更されたら自動的に再読み込みする。
<configuration scan="true" scanPeriod="30 seconds" > ... </configuration>
設定ファイルの構文
propertiesファイルを指定することも可能。
<configuration> <property file="src/main/java/chapters/configuration/variables1.properties" /> <!-- クラスパス上のリソース指定 --> <property resource="resource1.properties" /> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>${USER_HOME}/myApp.log</file> <encoder> <pattern>%msg%n</pattern> </encoder> </appender> <root level="debug"> <appender-ref ref="FILE" /> </root>
変数のスコープはローカル、コンテキスト、システムの3種類。
xmlのpropertyにscope="context"などで指定。
変数のデフォルト値は"${aName :-golden }"で指定可能。bash記法。
その他にも以下あり。用法を守らないと複雑になるので乱用は厳禁。
・設定ファイル内の条件分岐
・JNDIから変数を取得
・ファイルの取り込み(includeで他XMLを取り込む)
logback入門 〜logbackアーキテクチャ
logbackアーキテクチャ
https://logback.qos.ch/manual/architecture_ja.html
基本構成
最終的に全てのロガーがレベルを継承できるように、ルートロガーには必ずレベルが割り当てられている。デフォルトDEBUG。
LoggerContextは、接続してきたロガーを階層的な木構造として保持。
階層はX.Y.Zのように定義。
ルートロガーは、ロガー階層の最上位に存在。複数の階層構造すべてに含まれる。
レベルを定義すると、そのロガーの子よりも下位にレベルが引き継がれる。
ルート X X.Y X.Y.Z
レベルは次の順序。
ロガーのレベルがINFOだと、debugレベルでロギング要求(Logger.debug()呼出し)しても無視される。
TRACE < DEBUG < INFO < WARN < ERROR
一度ロガーのインスタンスを設定すれば、わざわざ参照を渡さなくても、コード中のどこででも同じインスタンスを取得できる。
アペンダーとレイアウト
アペンダーは、ログの送り先。
具体的にはコンソール、ファイル、データベースへのリモート接続(MySQLやPostgreSQLやOracle)、JMS、リモートSyslogデーモン。
リモート接続は性能劣化するので注意。
デフォルトでは、ロガー階層からアペンダーも引き継ぐ。
例えば、ルートロガーにコンソールアペンダー割り当てたなら、有効なロギング要求は少なくともコンソールに出力される。
ロガーのadditivityフラグをfalseに設定すれば、アペンダーを継承しないよう振る舞いを変更できる。
アペンダーとレイアウトを関連付けることで、ロギング要求を整形できる。
性能
メソッドの呼び出しによっては隠れたパラメータ構築のコストが発生。
例えば、ロガーxについて次のように実装されているケース。
x.debug("Entry number: " + i + "is " + entry[i]);
コスト回避するため、SLF4Jのパラメータ化されたロギングを利用すること。
x.debug("Entry number: {} is {}", i, entry[i]);