Search on the blog

2013年2月3日日曜日

Learn log4j(3)

log4jなかなか面白いですねー。
ロガーの名前階層(logger hierarchy)を確認するために簡単なコードを書いてみました。
package a.b.c.d;

import org.apache.log4j.Logger;

public class Main {
    public static void main(String[] args) {
        Logger logger = Logger.getLogger(Main.class);
        logger.info("test!");
    }
}
ロガーの設定はこんな感じ。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="console1" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="package a : %m%n" />
        </layout>
    </appender>
    <appender name="console2" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="package a.b : %m%n" />
        </layout>
    </appender>
    <appender name="console3" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="package a.b.c : %m%n" />
        </layout>
    </appender>
    <appender name="console4" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="package a.b.c.d : %m%n" />
        </layout>
    </appender>

    <logger name="a">
        <level value="info" />
        <appender-ref ref="console1" />
    </logger>
    <logger name="a.b">
        <level value="info" />
        <appender-ref ref="console2" />
    </logger>
    <logger name="a.b.c">
        <level value="info" />
        <appender-ref ref="console3" />
    </logger>
    <logger name="a.b.c.d">
        <level value="info" />
        <appender-ref ref="console4" />
    </logger>

</log4j:configuration>
これを実行すると、
package a.b.c.d : test!
package a.b.c : test!
package a.b : test!
package a : test!
となります。

a.b.c.d.Mainという名前のロガーを作ると、ログを出力する際にその親である

  • a.b.c.d
  • a.b.c
  • a.b
  • a
という名前のロガーにも「ログを出力せよ」という命令が伝わります。

もし自分より上の親たちには命令を伝えたくないという場合はadditivity属性をfalseにすればOKです。
<logger name="a">
    <level value="info" />
    <appender-ref ref="console1" />
</logger>
<logger name="a.b">
    <level value="info" />
    <appender-ref ref="console2" />
</logger>
<logger name="a.b.c" additivity="false">
    <level value="info" />
    <appender-ref ref="console3" />
</logger>
<logger name="a.b.c.d">
    <level value="info" />
    <appender-ref ref="console4" />
</logger>
とすると出力は、
package a.b.c.d : test!
package a.b.c : test!
のようになります。

0 件のコメント:

コメントを投稿