torutkのブログ

ソフトウェア・エンジニアのブログ

log4jのAsyncAppender

先日書いたマルチスレッド下のログ出力性能測定 - torutkの日記への補足となります。コメントで、log4jには、AsyncAppenderがあると教えてもらい、log4jでAsyncAppenderを使ったときの性能計測を先日のブログに追加しました。

ここでは、AsyncAppenderを設定した際のメモを記述します。

設定ファイルはXMLが必要

log4jの設定は、PropertyConfiguratorを使って、Javaのプロパティ形式で記述するのが一般的(?)です。

しかし、AsyncAppenderを使うときは、設定をDOMConfiguratorを使って、XML形式で記述する必要があるとのことです。

log4jの初期化は、DOMConfiguratorのconfigureメソッドに設定ファイル(XML)を指定します。

import org.apache.log4j.xml.DOMConfigurator;
    :
    DOMConfigurator.configure("log4j.xml");

AsyncAppenderは、JavaのioライブラリでいえばBufferedOutputStreamのような役割で、本来のAppenderへのログ出力の前段に挟んで非同期化(ログ出力完了を待たずにバッファに書いたら復帰)するものです。

まずはふつうのFileAppenderに出す設定をXMLで記述し、AsyncAppenderは、FileAppenderを参照する記述を行います。

<?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="threshold" value="trace"/>
  <param name="File" value="RunWithL4jAsync.log"/>
  <param name="Append" value="true"/>
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern"
          value="%d{yyyy/MM/dd HH:mm:ss,SSS} %c%n %p %m%n"/>
  </layout>
 </appender>

  <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
    <param name="threshold" value="trace"/>
    <appender-ref ref="FILE"/>
  </appender>

 <category name="jp.gr.java_conf.torutk.algorithm.prime.EratosthenesL4j">
  <priority value="trace"/>
  <appender-ref ref="ASYNC"/>
 </category>

 <root>
  <priority value="info"/>
  <appender-ref ref="STDOUT"/>
 </root>

</log4j:configuration>

AsyncAppenderを経由すると、%C、%Mが出ない

PatternLayoutで、%C(クラス名)と%M(メソッド名)を使用したところ、FileAppenderへの出力時はそれぞれ所定の文字列が入っていましたが、AsyncAppenderを経由してFileAppenderへ出したときには、この両者とも'?'となって所定の文字列が得られませんでした。