突然質問です。
問題が発生したことを知るためには、どこにログを出力しますか?
テキストファイル?
イベントログ?
データベース? ・・・ う・・・ まぁ、いいかもしれません。
・・・
他にはありませんか?
実は、意外と知られていないですが、ログの出力にとても有効な場所があるんです。
特に内部データ出力、内部動作のトレースログなど、データ量が多いものは、
テキストに落としては重い。
リアルタイムに見られない。
という問題があります。
そういう時に、とても有効です。
リアルタイムに見られて、「軽い」 場所があるんです。
それはズバリ、デバッガです。
「え? だどさん、開発のときの話だったの?リリースしてからだと思ったよ」
いえいえ。
もちろん、開発時も使えますが、開発時の話だけではありません。
本番環境にリリースしてからも有効なんです。
Windows API には OutputDebugString という API があり、これを呼び出すとデバッガにトレースログを出力することが出来ます。
こんな型です。
void WINAPI OutputDebugString(
__in_opt LPCTSTR lpOutputString
);
OutputDebugString をプログラムから呼ぶと、デバッガがあるときだけ、デバッガがそれを捕らえて、トレースログを表示します。デバッガが無いときは何もしません。
デバッガというと、WinDbg、CDB、Visual Studio IDE などいろいろありますが、OutputDebugString からの出力を見るだけなら SDK ツールの DbMon や、DebugView などのツールを使えばログをみることが出来ます。
ちなみに、.NET Framework では System.Diagnostics.Debug.Write 等が同様のことをします。
よくやるのは、開発者用のレジストリや構成ファイルに DebugLog 値を設定しておき、運用時に障害が発生したときだけそれを True にするとデバッグトレースが出力される、というようなことです。
あなたの設計パターンのひとつに、ぜひ入れておいて下さい!
それではまた!!
Windows プログラミング、Web プログラミングを極めるなら、元マイクロソフトの技術主任が書いた Windows の徹底解説サイト