先日書いたマルチスレッド下のログ出力性能測定 - 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へ出したときには、この両者とも'?'となって所定の文字列が得られませんでした。