トレースログの出力
プログラムをリリースしてから運用中に不具合が疑われる場合には、調査用のフラグが埋め込まれてあって、 そのフラグを ON にするだけで調査ログが取得できたら便利ですよね。
そしてその調査ログもテキストファイルで取得できれば、開発チームが入手するのも簡単です。
以前はそうしたスイッチ類含めて設定類はレジストリに置くことも多かったですが、 .NET Framework では建前上クロスプラットフォームということもあって、 アプリケーション設定ファイルに置くのが普通になってます。
.NET Framework の診断系の機能は System.Diagnostics 名前空間以下にあります。
イベントの記録として使える場所は主にイベントログ、デバッガ、トレース等があります。 今回はその中でトレース機能の簡単な使い方について説明します。
特にテキストファイルに診断トレースを書き込む方法です。
まず、トレースリスナーを設定ファイルに登録します。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
...
<system.diagnostics>
<trace autoflush="true" indentsize="4">
<listeners>
<add
name="MyListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="C:\Logs\Trace.log"/>
</listeners>
</trace>
</system.diagnostics>
</configuration>
ここで System.Diagnostics.TextWriterTraceListener を指定することで、テキストファイルへの書き出しとなります。 トレースログのパスは initializeData で指定できます。
設定はこれだけです。リスナーが設定されていれば、ログを出力し、されていなければ出力されません。特にエラーが発生するわけでもなく、単に捨てられます。
プログラム内では要所要所で必要に応じて、Trace クラスの WriteLine メソッドなどで必要な情報を出力しておきます。
WriteLine メソッドの他、条件を満たすときのみトレースを出力する WriteLineIf メソッドもあります。
使用例は次のとおりです。ここではサンプルのため単に Trace のメソッドを呼んでいますが、 実際の場合では例外をキャッチしたときや、その他処理が複雑で怪しい場所にトレースを埋め込んで置くとよいでしょう。
using System.Diagnostics;
namespace tracetest1 {
class Program {
static void Main(string[] args) {
Trace.WriteLine("Hello, Trace");
// 条件付きトレース
var i = 10;
Trace.WriteLineIf(i < 5, "i < 5");
Trace.WriteLineIf(i > 5, "i > 5");
// カテゴリ表示
Trace.WriteLine("Foo", "C1");
// インデント
Trace.WriteLine("123", "C2");
Trace.Indent();
Trace.WriteLine("456", "C2");
Trace.Unindent();
Trace.WriteLine("789", "C2");
}
}
}
上記の実行結果、次のように出力されます。
Hello, Trace i > 5 C1: Foo C2: 123 C2: 456 C2: 789
実際のトレースにはプログラムの開始時刻、イベントの発生時刻等を記録しておくと、その後の調査に役に立つのでよいと思います。