logback0.9.11の設定ファイル構文

感想おまちしてます!

参考:Configuration file Syntax

<configuration>
<appender>     0以上
<layout>         0以上
<filter>            0以上
<logger>           0以上
<appender-ref> 0以上
<root>                  1
<appender-ref> 0以上
スポンサーリンク

logger

設定可能な属性
name 必須。
level 任意。大文字小文字区別なし。TRACE or DEBUG or INFO or WARN or ERROR or ALL or OFF。その他、INHERITED or NULL
aditivity 任意。true or false

root

ルートロガーの設定。

設定可能な属性
level 任意。デフォルトはDEBUG。大文字小文字区別なし。TRACE or DEBUG or INFO or WARN or ERROR or ALL or OFF(INHERITED or NULLは設定付加)

loggerとroot要素のExample

appender-ref

設定可能な属性
ref 必須。Appender要素で定義したname属性を記述することで参照できる。

Chapter3 Sample2
以下のように出力すると、chapterパッケージ以下はINFOレベルとなる。

<logger name="chapter3" level="INFO"/>

Chapter3 Sample3
複数指定することも可能。

<logger name="chapter3" level="INFO" />
<logger name="chapter3.Foo" level="DEBUG" />

この例で、chapter2.MyAppクラスのレベルはどうなるかというと、設定されていないので設定値はnullになるが、実際にはchapter3パッケージのINFOを継承する。
basic-selection ruleに詳しいルールが書かれている。

Chapter3 Sample4
rootにOFFを設定した場合。chapterパッケージにINFOが設定されているので、chapterパッケージ以下はすべてINFOになる。

<logger name="chapter3" level="INFO" />
<!-- turn OFF all logging (children can override) -->
<root level="OFF">
<appender-ref ref="STDOUT" />
</root>

appender

設定可能な属性
name 必須。Appenderの名前を自由に定義する。STDOUTとかFILEとかが一般的。
class 必須。Appenderのクラスを記述する。「ch.qos.logback.core.ConsoleAppender」とか「ch.qos.logback.core.FileAppender」など。Javadocを見るとメールを投げるものとかもある。

filter

設定可能な属性
class Filterクラスを指定する。

layout

設定可能な属性
class 「ch.qos.logback.classic.PatternLayout」など、layoutクラスを指定する。

複数のAppenderに出力する場合の設定

<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>myApp.log</file>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</Pattern>
</layout>
</appender>
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%msg%n</Pattern>
</layout>
</appender>
<root>
<level value="debug" />
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT" />
</root>
</configuration>

Loggerが同じAppenderを参照する場合

<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
</layout>
</appender>
<logger name="chapter3">
<appender-ref ref="STDOUT" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</configuration>

Loggerが異なるAppenderを参照する場合

<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>myApp.log</file>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</Pattern>
</layout>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%msg%n</Pattern>
</layout>
</appender>
<logger name="chapter3">
<appender-ref ref="FILE" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</configuration>

Overriding the default cumulative behaviour

簡単に言うと親階層の継承を拒否する設定みたい。
例えば、以下のように設定する。

<logger name="com.daipresents.logging.logback.first">
<appender-ref ref="FILE1" />
</logger>
<logger name="com.daipresents.logging.logback.first.second" additivity="false">
<appender-ref ref="FILE2" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>

こうすると、

  • firstパッケージのクラスはFILE1とrootのSTDOUTにログを出す
  • secondパッケージのクラスはFILE2だけにログを出す

になる。つまり、「additivity=false」でrootの設定を無視することになる。
以下の設定でも試してみた。
逆に、親でadditivityをfalseにしたら子はどうなるか?

<logger name="com.daipresents.logging.logback.first" additivity="false">
<appender-ref ref="FILE1" />
</logger>
<logger name="com.daipresents.logging.logback.first.second" additivity="true">
<appender-ref ref="FILE2" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>

この場合は、

  • firstパッケージ、secondパッケージのクラスはSTDOUTにはログを出さない
  • firstパッケージのクラスはFILE1にログを出す
  • secondパッケージのクラスはFILE1とFILE2にログを出す

となった。親パッケージで「additivity=false」を設定されてしまうと、子でがんばってもどうにもならんらしい。