Q3:パッケージによって出力ファイルを分けるには?

logger 要素で出力パッケージを指定します。

root 要素はすべてのログ出力に対して有効になります。サードパーティのライブラリの中にはLog4jやJakarta Commons Loggingを使用しているものも多く、root 要素を使用するとサードパーティのログまで出力されてしまうことがあります。

そのため、開発したシステム内部で出力するログのみ出力したい場合や、パッケージによって出力ファイルを分ける必要がある場合は、logger 要素を使用します。

以下では logtest.p1 という名前の logger 要素を定義しています(<logger name="logtest.p1">)。すると、logger 名が "logtest.p1.*" にマッチする Logger から出力されたログのみ、この logger 要素が示す Appender からログが出力されることになります。

logger 名は、Logger#getLogger() に与えた引数と対応しており、 Logger#getLogger に Class オブジェクトを与えた場合はクラスの FQCN(パッケージ名まで含んだクラス名) が logger 名となります。従ってすべてのクラスで Logger#getLogger() の引数に自クラスの Class オブジェクトを与えておけば、設定ファイルでパッケージ毎の出力制御ができることになります。

つまり、logger "logtest.p1"は、「パッケージ logtest.p1 及びそのサブパッケージ配下のクラスが出力するログを扱う logger」と言えます。

以下の設定は、 debug レベル以上のすべてのログを標準出力へ出力し、 logtest.p1 配下のクラスが出力するログをファイルへ出力するというものです。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

  <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
    <param name="File"   value="log/example.log" />
    <param name="Append" value="true" />                
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%t %-5p %c{2} - %m%n"/>
    </layout>   
  </appender>

  <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern"
        value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
    </layout>           
  </appender>
  
  <logger name="logtest.p1">
    <level value="debug" />
    <appender-ref ref="FILE" />
  </logger>

  <root>
    <level value ="debug" />
    <appender-ref ref="STDOUT" />
  </root>

</log4j:configuration>

トップページへ戻る