出力先ファイル名にプログラムの起動日時を入れる

 log4cppには出力ファイルのサイズでローリングする、すなわち、指定した最新のバイト数のログだけを残すということはできます(RollingFileAppender)。ですが、例えば、1週間分のログだけを残したいといった場合にはlog4cppは対応していません。
 ここでは、簡易的に対応する方法を説明します。

考え方

 独自のAppenderを作成すればもちろん可能ですが、このやり方だと、設定ファイルによる読み込み部分までlog4cppを改造することになり、面倒ですから、極力、既にあるlog4cppの機能でどうにかならないか考えます。

 さて、その方法ですが、FileAppenderあるいはRollingFileAppenderの出力先ファイル名(パス)に日付を含めてしまおうというものです。
 やり方は、まず、環境変数(名前は何でも良い)に日付(「/」などファイルパスに使用できない文字を取り除いたもの)を設定します。
 そして、設定ファイルにてファイル名を設定するところで、その環境変数を参照するようにすればOKです。

例(Linux)

設定ファイルの例:

rootCategory=DEBUG, A4

appender.A4=org.apache.log4j.FileAppender
appender.A4.fileName=log${NowDate}.log
appender.A4.layout=org.apache.log4j.BasicLayout
ファイル名のところに環境変数「NowDate」を指定しています。

プログラムの例:

  1. #include <log4cpp/Category.hh>
  2. #include <log4cpp/PropertyConfigurator.hh>
  3. int main(void){
  4. const char* propFileName = "props.properties";
  5. log4cpp::PropertyConfigurator::configure( propFileName );
  6. log4cpp::Category& root = log4cpp::Category::getRoot();
  7. root.error("message");
  8. log4cpp::Category::shutdown();
  9. return 0;
  10. }

環境変数設定の例:

NowDate=`date +%y%m%d`
export NowDate

実行結果の例(※実施日:2012/04/27):

takashi@takashi-virtual-machine:~/デスクトップ/ctest4$ ls
a.out  log120427.log  main.cpp  props.properties
「log120427.log」が生成されていますね!