* log4cpp [#oa019ba0]
 ログを吐き出すライブラリ。使い方をマスターすれば便利そうだが、とっかかりは非常に面倒ぽい。
 
 *** ソース [#j8807fbb]
 ここからダウンロードできる。ソースなのでビルドして使わにゃ。
 
 - [[Log for C++:http://log4cpp.sourceforge.net/]]
 - [[Log library for C++:http://sourceforge.net/projects/log4cpp/]]
 
 *** ビルド [#d799f765]
 Windows なので、VC++ 6 (.NET) などでビルドして使用する( nmake もあるかな?)。
 
 留意点
 - マルチスレッド (/MT または /MTd) にする。
 - _ATL_MIN_CRT は外しておく。
 
 ビルドすると log4cpp.lib と log4cpp.dll が作成されるので、これをプロジェクトから見える位置に配置する。
 「追加のインクルードディレクトリ」などに追加しちゃっても良いし、pragma でソースに書いても良い。
 
 *** 使用してみる [#x2dbfb7e]
 ライブラリへリンク。
 
  #pragma comment( lib, "log4cpp.lib" )
 
 ヘッダをインクルード。(log4cpp というディレクトリをインクルードしていると仮定。)
 
  #define LOG4CPP_HAVE_INT64_T
  #include <log4cpp/Category.hh>
  #include <log4cpp/FileAppender.hh>
  #include <log4cpp/OstreamAppender.hh>
  #include <log4cpp/Win32DebugAppender.hh>
  #include <log4cpp/SimpleConfigurator.hh>
 
 これだけあれば足りると思う。フィルタを使う場合は次のヘッダも必要。
 
  #include <log4cpp/Filter.hh>
 
 定義する。
 
  static log4cpp::Category& logroot = log4cpp::Category::getRoot();
  static log4cpp::Category& logger = log4cpp::Category::getInstance("category");
 
 ログだけなら logger だけでいいか。category には、アプリの名前なりクラスの名前なり解りやすい名前を設定しておく。
 
 で、初期化。
 
  #ifdef(_DEBUG)
   logroot.setPriority( log4cpp::Priority::DEBUG );
  #else
   logroot.setPriority( log4cpp::Priority::INFO );
  #endif
 	log4cpp::Appender* pDebugAppender = new log4cpp::Win32DebugAppender("w32dbg");
 	log4cpp::Appender* pFileAppender = new log4cpp::FileAppender("file", "debug.log");
 	logroot.addAppender(pDebugAppender);
 	logroot.addAppender(pFileAppender);
 	try {
 		log4cpp::SimpleConfigurator::configure( "sample.config" );
 	} catch(log4cpp::ConfigureFailure e) {
 		logroot.warn("FAILED: Loading %s: %s", "sample.config", e.what());
 	}
 
 出力レベルを設定して、インスタンスをつくって、設定ファイルを読み込んでいる。
 sample.config は設定ファイルなので、ここに設定を書いておく。
 
 例えばこんな感じ。
 
  <sample.config>
  # ログレベルの設定:
  # priority {カテゴリ名} {ログレベル}
  # 設定したログレベルはカテゴリ階層へカスケードされる。
  priority root WARN
  priority category DEBUG
  # 書式の設定:
  appender category pattern file debug.log %d [%c] %p - %m%n
 
 root というカテゴリは WARN レベルまで、category というカテゴリは DEBUG レベルまで出力されるよ、という意味。
 
  高 EMERG, FATAL(システムが使用不可) 
  ↑ ALERT(ただちに行動を起こさなければならない) 
    CRIT(危険な状態) 
    ERROR(エラーの状態) 
    WARN(ワーニングの状態) 
    NOTICE(通常だが重要な状態) 
  ↓ INFO(インフォメーションメッセージ) 
  低 DEBUG(デバッグレベルのメッセージ) 
 
 書式の意味は次の通り。
 
  %% : %一個 
  %c : カテゴリ 
  %d : 日付と時刻 
  %m : メッセージ 
  %n : 改行 
  %p : プライオリティ 
  %r : レイアウトインスタンスが作られてからの時間(ミリ秒単位) 
  %R : 1970年元旦からの秒数 
  %u : プロセスが起動してからのclock tics 
  %x : NDC 
 
 書式は、ソースで PatternLayout で設定することもできるっぽい。設定しなければ、デフォルトで "%m%n" となる。
 
 あとは、
 
  logger.debug("ごにょごにょ");
  logger.info("ほげほげ");
 
 とかで出力する。
 
 使い終わったらシャットダウン。
 
  log4cpp::Category::shutdown();
  logger.shutdown();
  logroot.shutdown();
 
 ところで、フィルタの使い方がいまいちわからんです。
 
 
 *** 参考サイト [#c2ec8f7d]
 - [[Log4cpp memo:http://www.argv.org/~chome/log4cpp.html]]
 - [[いろいろ memo:http://www5d.biglobe.ne.jp/~y0ka/cat_log4cpp.html]]
 - [[dot.diary:http://d.hatena.ne.jp/dot/20031111]]
 - [[SDN(英語):http://developers.sun.com/solaris/articles/logging.html]]
 
 -----
 
 [[プログラム・開発系メモ]]

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS