darjeeling-tea's blog

オープンな個人ノートです。

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

一度ロガーのインスタンスを設定すれば、わざわざ参照を渡さなくても、コード中のどこででも同じインスタンスを取得できる。

アペンダーとレイアウト

アペンダーは、ログの送り先。
具体的にはコンソール、ファイル、データベースへのリモート接続(MySQLPostgreSQLOracle)、JMS、リモートSyslogデーモン。
リモート接続は性能劣化するので注意。

デフォルトでは、ロガー階層からアペンダーも引き継ぐ。
例えば、ルートロガーにコンソールアペンダー割り当てたなら、有効なロギング要求は少なくともコンソールに出力される。

ロガーのadditivityフラグをfalseに設定すれば、アペンダーを継承しないよう振る舞いを変更できる。

アペンダーとレイアウトを関連付けることで、ロギング要求を整形できる。

性能

メソッドの呼び出しによっては隠れたパラメータ構築のコストが発生。
例えば、ロガーxについて次のように実装されているケース。

  x.debug("Entry number: " + i + "is " + entry[i]);

コスト回避するため、SLF4Jのパラメータ化されたロギングを利用すること。

  x.debug("Entry number: {} is {}", i, entry[i]);