設定ファイルの書き方

設定ファイルについては、こちらに書かれていますが、情報が少なすぎなので説明します。

# a simple test config

log4j.rootCategory=DEBUG, rootAppender
log4j.category.sub1=A1
log4j.category.sub2=INFO
log4j.category.sub1.sub2=ERROR, A2

log4j.appender.rootAppender=org.apache.log4j.ConsoleAppender
log4j.appender.rootAppender.layout=org.apache.log4j.BasicLayout

log4j.appender.A1=org.apache.log4j.FileAppender
log4j.appender.A1.fileName=A1.log
log4j.appender.A1.layout=org.apache.log4j.BasicLayout

log4j.appender.A2=org.apache.log4j.ConsoleAppender
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=The message %m at time %d%n

基本的なこと

基本的にはJavaのプロパティファイルの形式です。
と言っても良く分からないので、説明します。

形式

 形式は、

キー名=値

です。

 キー前後、および、値の前後にスペースがあってもかまいません。
すなわち、

____キー____=____値____________

となっていてもかまいません(※ここで「_」は半角スペースを表す)。

 ちなみに、キー名の先頭に「log4j.」あるいは「log4cpp.」があった場合、それは無視されます(削除された状態で管理される)。

コメント

「#」の後はコメントと見なされます。

1行の長さ

1行の長さの最大長は255文字(バイト)です。
注意:先頭文字が「#」で、コメント行であっても255までです。
これを超えると、うまく読み込まれなくなります。

環境変数や他のキーに対する値への置換

 まず、使うことはないと思いますが、値については環境変数を使うことができます。
環境変数名は「${」と「}」の間にはさんでください。
例えば、

test.subst.1=> ${HOME} <

だと

test.subst.1=> /home/takashi <

のように展開されます(※もちろん、環境に依存します)。

 他のキーに対する値に置換することもできます。
例えば、

appender.A4=org.apache.log4j.FileAppender
test.subst.3=> ${appender.A4} <

だと、2つめは、

test.subst.3=> org.apache.log4j.FileAppender <

のように展開されます。
注意:ここでのキー名は、キー名の先頭の「log4j.」もしくは「log4cpp.」を取り除いたキー名です。
それと、定義順を逆にするとうまくいかないです。

 なお、定義されてない環境変数名、あるいは、キー名が設定された場合、空文字で置換されます。

log4cppの設定方法

 カテゴリやアペンダーなどの設定方法は以下の通りです。
※設定順は、値に「${」、「}」を使った別のキーの値の置換を使用しない限りは、どのような順であってもかまいません。

カテゴリの設定

 ルートカテゴリについてはキー名を「rootCategory」とします。その他のカテゴリについてはキー名を「category.カテゴリ名」とします。
値は、優先度をまず定義し、以降、カンマ区切りでそのカテゴリに設定するアペンダー名を列挙します。
※カテゴリを階層構造にする場合は「.」で区切ってください。「::」で区切らないでください。
※注意:ルートカテゴリの優先度にNOTSET(未設定)は設定できません。

 カテゴリに設定するadditivityについては、キー名を「additivity.rootCategory」か「additivity.category.カテゴリ名」とします。値には「true」か「false」が設定可能です。additivityの設定を省略するとtrueを設定したものと見なされます。

アペンダーの設定

 アペンダーを設定するには、まず、「appender.アペンダー名」というキーを定義し、その値を、アペンダーのクラス名とします。
アペンダーのクラス名として有効なのは以下のものです。

  • ConsoleAppender
  • FileAppender
  • RollingFileAppender
  • SyslogAppender
  • LocalSyslogAppender
  • AbortAppender
  • IdsaAppender
  • Win32DebugAppender
  • NTEventLogAppender

※クラス名は最後の「.」以降のものが有効で、それより前のものは単に無視されるので、「org.apache.log4j.ConsoleAppender」としても、単に「ConsoleAppender」としても同様です。
※注意:すみませんが、「log4cpp::ConsoleAppender」のように「::」で区切るのはやめて下さい。
※注意:OS等の環境によっては上記のクラスのうちいくつかは使用できないものがあります。
※注意:log4cppにはConsoleAppenderというクラスはありません。ConsoleAppenderを指定するとlog4cpp::OstreamAppenderが使用されます。

 全ての(?)アペンダーに共通する設定として、閾値(しきいち:threshold)とレイアウト、フィルターがあります。

 まず、閾値については、キーと値を次のように設定します。

キー名:appender.アペンダー名.threshold
値:優先度

設定を省略すると、NOTSET(未設定)を設定したと見なされます。

 次に、レイアウトですが、キーと値を次のように設定します。

キー名:appender.アペンダー名.layout
値:Layoutクラスのサブクラスの名前。すなわち、「BasicLayout」、「SimpleLayout」、「PatternLayout」のいずれか。

※クラス名は最後の「.」以降のものが有効で、それより前のものは単に無視されるので、「BasicLayout」は「org.apache.log4j.BasicLayout」としても良いです。
※注意:すみませんが、「log4cpp::BasicLayout」はダメです。
※注意:レイアウトが設定できないアペンダーに対してレイアウトを設定しても無視されます。
※注意:レイアウトの設定を省略するとBasicLayoutを設定したものと見なされます。
※クラス名を「PatternLayout」とした場合、「appender.アペンダー名.layout.ConversionPattern」というキーを定義でき、その値に、 log4cpp::PatternLayout::setConversionPattern()で使用できるフォーマット文字列を使用して任意のフォーマットを指定できます。省略すると、「"%m%n」となります。

 フィルターについてですが、これについては設定ファイルからの設定は不可能となっています。log4cpp::PropertyConfigurator::configure()メソッドを使用して設定ファイルから設定を読み込んだ後、プログラムから設定をする必要があります。

 後は、アペンダーのクラスに固有の設定ですね。それについては、 キー名を「appender.アペンダー名.設定名(fileName)など」とします。 詳細は以下の通りです。

  • ConsoleAppender
    固有の設定なし。
  • FileAppender
    • fileName:出力先ファイル名です。省略すると"foobar"となります。
    • append:すでにファイルが存在する場合、それを切捨てするか(削除して新しく作成)、追記するかを指定します。省略するとtrue(追記)となります。
  • RollingFileAppender
    • fileName:出力先ファイル名です。省略すると"foobar"となります。
    • maxFileSize:ファイルの最大サイズです。省略すると10*1024*1024バイトとなります。
    • maxBackupIndex:古いログファイルをどこまで残すかを設定します。省略すると1となります。
    • append:すでにファイルが存在する場合、それを切捨てするか(削除して新しく作成)、追記するかを指定します。省略するとtrue(追記)となります。
  • SyslogAppender
    • syslogName:openlog(3)関数を呼び出すときのident引数です。省略すると"syslog"となります。
    • syslogHost:標準syslogホストのIPアドレスもしくはホスト名です。省略すると"localhost"となります。
    • facility:ログ出力時のsyslogのファシリティ。省略すると-1(デフォルト使用でLOG_USER)となります。
    • portNumber:代替ポート番号です。省略すると-1(デフォルト使用で514)となります。
  • LocalSyslogAppender
    • syslogName:openlog(3)関数を呼び出すときのident引数です。省略すると"syslog"となります。
    • facility:ログ出力時のsyslogのファシリティ。省略すると-1(デフォルト使用でLOG_USER)となります。
  • AbortAppender
    固有の設定なし。
  • IdsaAppender
    • idsaName:idsaのサービス引数です。省略すると"foobar"となります。
  • Win32DebugAppender
    固有の設定なし。
  • NTEventLogAppender
    • source:ログへのソース名です。省略すると"foobar"となります。

解析エラーとかを起こしたら?

 基本的には無視して次の行を解析しようとします。このため、ロクに解析もしないということがあります。
また、必ずしも何行目の何列目のどこどこが悪いですといった例外はスローしてくれません(スローしてくれる場合もある)。
 testsディレクトリの中に「testProperties.cpp」があります。これは読み込んだ設定ファイルをコンソールに出力するだけのテストプログラムなのですが、自分で作成した設定ファイルで思うようにログ出力されていないようなときには使ってみる価値があります。
 ビルドは、*nix(LinuxやUnixのこと)であれば、cdコマンドでtestsディレクトリに移動し、

g++ -o testProperties testProperties.cpp -I../include -I../src -L../src/.libs -llog4cpp -lpthread -static

としてください。