log4j.xml書き方メモ

log4j.xml の書き方メモ。


#シンプル
```xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >

  <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
     <param name="Target" value="System.out" /> 
     <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m%n" />
     </layout>
  </appender>

  <root>
    <appender-ref ref="stdout"/>
  </root>
</log4j:configuration>
```

全てのログを標準出力にそのまま吐き出す。

#ファイル出力
```xml:
<?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.FileAppender">
     <param name="File" value="./sample.log" />
     <param name="Append" value="true" />
     <param name="Encoding" value="Shift_JIS" />
     <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m%n" />
     </layout>
  </appender>
  
  <root>
    <appender-ref ref="file"/>
  </root>
</log4j:configuration>
```

- 全てのログを `./sample.log` というファイルにそのまま吐き出す。
- 出力先のフォルダが存在しない場合は、自動で作成される。

#ロガー分け
```xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >
  
  <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
     <param name="Target" value="System.out" /> 
     <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m%n" />
     </layout>
  </appender>

  <appender name="file" class="org.apache.log4j.FileAppender">
     <param name="File" value="./sample.log" />
     <param name="Append" value="true" />
     <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m%n" />
     </layout>
  </appender>
  
  <logger name="log4j.sample.console">
    <appender-ref ref="stdout" />
  </logger>
  
  <logger name="log4j.sample.file">
    <appender-ref ref="file" />
  </logger>
  
  <root>
  </root>
</log4j:configuration>
```

ロガーが `log4j.sample.console` の場合は標準出力に、 `log4j.sample.file` の場合はファイルに出力。
※root ロガーには何も設定していないが、もし他にもロガーがある場合は root にも appender を追加する必要あり。

#appender にログレベルを設定する
```xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >
  
  <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
     <param name="threshold" value="error"/>
     <param name="Target" value="System.out" /> 
     <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m%n" />
     </layout>
  </appender>
  
  <root>
    <appender-ref ref="stdout" />
  </root>
</log4j:configuration>
```

`<param name="threshold" value="error"/>` で設定。
この場合、 __error 以上__ のみ出力。

#ロガーにログレベルを設定する
```xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >
  
  <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
     <param name="Target" value="System.out" /> 
     <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m%n" />
     </layout>
  </appender>
  
  <root>
    <level value ="debug" />
    <appender-ref ref="stdout" />
  </root>
</log4j:configuration>
```

`<level value ="debug" />` で設定。
この場合、 __debug 以上__ のみ出力。

#メッセージのフォーマット
```xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >

  <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
     <param name="Target" value="System.out" /> 
     <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="[%-5p] [%d{yyyy/MM/dd HH:mm:ss.SSS}] [%t] - %m%n" />
     </layout>
  </appender>

  <root>
    <appender-ref ref="stdout"/>
  </root>
</log4j:configuration>
```
|フォーマット |出力されるもの                 |使用例                        |
|:------------|:------------------------------|:-----------------------------|
|`%p`         |ログレベル                     |`[%-5p]`                      |
|`%d`         |時刻                           |`%d{yyyy/MM/dd HH:mm:ss.SSS}` |
|`%t`         |スレッド名                     |`[%t]`                        |
|`%m`         |ログメッセージ                 |`%m`                          |
|`%n`         |改行コード                     |`%n`                          |
|`%l`         |ログ出力したソースコードの場所 |`%l`                          |

```text:出力例
[FATAL] [2012/06/30 15:44:22.991] [main] - fatal
[ERROR] [2012/06/30 15:44:22.991] [main] - error
[WARN ] [2012/06/30 15:44:22.991] [main] - warn
[INFO ] [2012/06/30 15:44:22.992] [main] - info
[DEBUG] [2012/06/30 15:44:22.992] [main] - debug
log4j.Main.main(Main.java:11) message
```

#ファイルサイズでローテーションする
```xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >
  
  <appender name="sizeRotation" class="org.apache.log4j.RollingFileAppender">
     <param name="File" value="./sample.log" />
     <param name="Append" value="true" />
     <param name="Encoding" value="Shift_JIS" />
     <param name="MaxFileSize" value="10KB" />
     <param name="MaxBackupIndex" value="3" />
     <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m%n" />
     </layout>
  </appender>
  
  <root>
    <appender-ref ref="sizeRotation" />
  </root>
</log4j:configuration>
```

`sample.log` に出力しつつ、ファイルサイズが 10KB を超えたら `sample.log.1` というふうにローテーションする。

`MaxBackupIndex` に `3` を指定しているので、 `sample.log.3` までローテーションして、それより古いファイルは削除される。
未指定の場合は、デフォルト `1`。

`MaxFileSize` のデフォルトは 10MB。

#日付でファイルをローテーションする
```xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >
  
  <appender name="dailyRotation" class="org.apache.log4j.DailyRollingFileAppender">
     <param name="File" value="./sample.log" />
     <param name="Append" value="true" />
     <param name="Encoding" value="Shift_JIS" />
     <param name="DatePattern" value="'.'yyyy-MM-dd" />
     <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m%n" />
     </layout>
  </appender>
  
  <root>
    <appender-ref ref="dailyRotation" />
  </root>
</log4j:configuration>
```

毎日ローテーションする。
ローテーションされたファイルは、 `sample.log.2013-01-29` という名前になる。

日付書式は [SimpleDateFormat](http://docs.oracle.com/javase/jp/7/api/java/text/SimpleDateFormat.html) と同じ。

`'.'yyyy-MM-dd-HH-mm-ss` とか指定すれば、秒単位でローテーションできる。

ちなみに、 __古いファイルが自動で削除されることはない__ ので注意。
別途古いファイルを削除する仕組みが必要。


#参考
- [log4jリファレンス（category） | 忘れっぽいエンジニアの Jakarta Struts リファレンス](http://struts.wasureppoi.com/util/05_category.html)
- [Log4J徹底解説](http://www.nurs.or.jp/~sug/soft/log4j/index.htm)