NightWalkerの日記: log4cxxを組み込む
ググって見るとlog4cxxメモが上位に来ていてびっくり。あわてて誤字を直しておいた。
俺の日記が上位に来るとは、log4cxxよりlog4netのほうが旬なのかなー。
さて実際に組み込む時に気をつける点は2つ
・ログ出力しなくても書式展開することによるパフォーマンス低下
・排他制御
1つめは、もともとマクロが定義してあるのでそれを使えば良い事がわかった(このblogが詳しい)
LoggerPtr logger = Logger::getLoger( "hogehoge" ) ;
LOG4CXX_INFO( logger, "kwsk"マクロ定義されているのだが、isDebugEnabled()などを評価してからストリーム出力するので
パフォーマンス低下は最小限になる。
2つめの排他制御だが、同一アプリケーション内であればライブラリ内で排他制御されるようだ。
10スレッドくらいを同時に出力して見たがまったく問題なかった(上記LOG4CXX_DEBUGを使用)。
さて実際の組み込み作業はこうなった
ヘッダー
#pragma warning( disable : 4244 ) // 警告が出るので消す
#include "log4cxx/logger.h"
#include "log4cxx/propertyconfigurator.h" // PropertyConfigurator::configure で設定ファイルを変更するため
using namespace log4cxx;
#pragma warning( default : 4244 )
コンストラクタ
m_logger = Logger::getLogger( "カテゴリー名" ) ;
PropertyConfigurator::configure( "test.properties" ) ;
同じフォルダに複数のアプリケーションを置いて実行する場合は設定ファイル(log4j.properties)を変える必要がある。
しかし、log4j.propertiesもデフォルトで読むので置いておいたほうが良いかな?
設定ファイルの中で書式を設定する部分に%lを入れて置くと、ファイル名と行番号が入るのでちょっと便利
log4j.appender.file.layout.ConversionPattern=%d %5p %c{1} %l - %m%n
log4cxxはカテゴリ管理は自前でやらんといけないので、いっそ放棄して
log4j.appender.file.layout.ConversionPattern=%d %5p %l - %m%n
なんて開き直るにもいいかもしれない
必要なファイル
log4cxx/include/log4cxx 以下のファイルが全て必要になる。
log4cxx/msvc/lib/release/log4cxx.lib これも必要
log4cxx/msvc/bin/release/log4cxx.dll 実行時は当然コレもいる
「追記」
設定ファイルをxml形式にしたら、ファイルの切り替え(configure)がうまくいかない。
調べて見ると、xmlファイルの場合はDOMConfiguratorを使うのだそうだ
#include "log4cxx/propertyconfigurator.h"
PropertyConfigurator::configure( "hoge.properties" ) ;
↓
#include "log4cxx/xml/domconfigurator.h"
xml::DOMConfigurator::configure( "hoge.xml" ) ;
と書き換える。
log4cxxを組み込む More ログイン