現在これを行うには、log4cxx のドキュメントによると、少なくとも 1 つの MappedDiagnostic コンテキストを宣言する必要があります。
そうすることの未テストの部分的なスニペットを以下に示します
#include <sys/types.h>
#include <log4cxx/mdc.h>
#include <iostream>
#include <sstream>
int main (int argc, char **argv)
{
//at the start of your program
pid_t pid = getpid();
pid_t tid = gettid();
std::string pidstring;
std::string tidstring;
std::stringstream buffer;
buffer << pid << std::endl;
pidstring = buffer.str();
buffer.str(std::string());
buffer << tid << std::endl;
tidstring = buffer.str();
buffer.str(std::string());
MDC::put( "pid", pidstring);
MDC::put( "tid", tidstring);
// do actual stuff here
return 0;
}
log4cxx ソースをさらに調べたところ、file は ConversionPattern を使用せず、FileNamePattern を使用することがわかりました。TimeBasedRollingPolicy または FixedWindowRollingPolicy を使用している場合にのみ、FileNamePattern を使用できると思います。
これで、XML 構成ファイルのアペンダー タグに次のパラメーターを追加することで、プロセス ID をログに追加できます。
<rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="FileNamePattern" value="MyApplication-%d{yyyy-MM-dd}- %X{pid}.log"/>
<param name="activeFileName" value="MyApplication.log"/>
</rollingPolicy>
<param name="file" value="appxDailyLog.log"/>
または、XML 構成ファイルのアペンダー タグ内にも次のレイアウト タグを指定して、パターン レイアウトに含めることができます。
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%X{pid} %X{tid} %d{yyyy-MM-dd HH:mm:ss,SSS}"/>
</layout>
log4net でよく知られているように、構成ファイルから各プロセスに独自のプロセスを独自のログに追加させる簡単な方法はありません。
動的ログの名前変更について言及している log4cxx メーリング リスト スレッドがいくつかありましたが、それらはすべて C++ コードに多数の変更が含まれており、要求どおりに動作しません。
彼らが使用した方法には<param name="file" value="${logfilename}"/>
、 $logfilename が環境変数であり、
std::string filename ="MyApp-";
filename.append(pidstring);
logger = Logger::getLogger("Nameoflogger");
setenv("logfile.name", "MyApp.log", 1);
ログ名を変更するたびに、C++ コードで上記のスニペットのようなものを呼び出します。
他の方法では、現在必要な機能がないため、log4cxx へのパッチが必要になります。
参考文献
log4cxx 変換パターン Wiki
Apache log4cxx の簡単な紹介
log4cxx チュートリアル
MDC log4cxx クラス リファレンス