Show page source of OutputSrcLocation #80602

[[PageNavi(NavigationList)]]

==== ログにソースのファイル名、行番号、スレッド名など出力する ====
{{{ html
<span style="float:left">
}}}

{{{ GoogleAdsense
<script type="text/javascript"><!--
google_ad_client = "ca-pub-0702888637712330";
/* 20120131 */
google_ad_slot = "8641490082";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
}}}

{{{ html
</span>
}}}


 標準ではログ出力用のメソッドを呼んだときのソースの場所(ファイル名、行番号)は出力されませんが、あると、デバッグ時や障害発生時の解析時に便利です。また、メソッド呼び出し時のスレッド名[[Footnote([http://log4cpp-jp.sourceforge.jp/api/classlog4cpp_1_1PatternLayout.html パターンレイアウト]を使用し%tを指定すると、スレッドIDが出力することができます。しかし、スレッドIDは実行するたびに変わるものであり、障害発生時の解析のときには使い難い情報ですから、プログラムで指定したスレッド名を出力するようにした方が良いです。)]]も出力されていると、便利です。ですから、極力、出力するようにしましょう。[[BR]]



===== やり方
 ソースの場所(ファイル名、行番号)の出力については、メッセージの中に!__FILE!__、!__LINE!__マクロの内容を含めてしまいましょう。コンパイラによっては、!__func!__(関数名)も出力可能な場合があります。[[BR]]
 しかし、ログ出力を行う場所で、毎度、毎度メッセージの中に!__FILE!__などの値を入れ込むのは面倒ですし、ログ出力だけで、ソースが長くなり、可読性が悪くなってしまいます[[Footnote(ログ出力というのは、プログラムで本当に行いたい処理ではありません(処理の本質ではありません)。例えば、ソースを見たときにログ出力ばかりが目に付いたら、本来行うべき処理が見難くなってしまいます。ログ出力そのものの実行で、ソースが2行以上になっていたら、それは可読性が悪くなっていると考えましょう。)]]。[[BR]]

 ということで、関数マクロを使いましょう。[[BR]]
例:
{{{ code cpp
#include <cstdarg>
#include <string>
#include <sstream>

/**
 * Categoryクラスのlog(Priority::Value priority, const char *stringFormat,...)メソッドの代わりに使用してください
 */
#define Log(priority , format , ...) \
    { \
        std::ostringstream sst; \
        sst << "[" __FILE__ "("; \
        sst << __LINE__; \
        sst << ")]"; \
        sst << format; \
        category->log(priority,sst.str(),__VA_ARGS__); \
    } \

// 呼び出し例
// category->log(log4cpp::Priority::WARN,"%s","test");
Log(log4cpp::Priority::WARN,"%s","test");
}}}
※例です。categoryの型はlog::Category*とし、スコープ内にあるものとします。



 スレッド名については[NDC NDC(ネスト化診断コンテキスト)]にスレッド名を設定するのが最も簡単です。

===== 参考資料など
 * 可変個引数を持つ関数マクロについて[[BR]]
   * [http://www.02.246.ne.jp/~torutk/cxx/tips/varargs.html C/C++での可変引数(stdarg他)]
   * [http://seclan.dll.jp/c99d/c99d02.htm プログラミング言語 C の新機能]

注:可変個引数を持つ関数マクロが定義可能かどうかはコンパイラの仕様を調べてください。

[[PageNavi(NavigationList)]]