を使用しようとはしませんでした<filter>
が、最近似たようなものをセットアップし、<switches>
and<sources>
要素を使用して成功しました。これが私がそれをした方法です:
<system.diagnostics>
<trace autoflush="true" indentsize="2" />
<sources>
<source name="SyncService" switchName="infoactivity">
<listeners>
<clear />
<add name="file" />
</listeners>
</source>
</sources>
<switches>
<add name="none" value="Off" />
<add name="infoactivity" value="Information, ActivityTracing" />
<...>
</switches>
<sharedListeners>
<add name="file" type="System.Diagnostics.TextWriterTraceListener"
initializeData="sync.log" />
</sharedListeners>
</system.diagnostics>
値を定義済みのスイッチのいずれかに変更するだけswitchName
で、適切なレベルのログを取得できます。
このコードでは、LogEvent スマート列挙型クラスにラップされた単一の静的 TraceSource を使用しました (Jon Skeet の回答の 1 つで例を見つけたと思います)。
public class LogEvent {
public static readonly LogEvent SyncStart = new LogEvent(1,
"Sync Service started on {0}", TraceEventType.Start);
public static readonly LogEvent SyncStop = new LogEvent(99,
"Sync Service stopped on {0}", TraceEventType.Stop);
public static readonly LogEvent SyncError = new LogEvent(501,
"\r\n=============\r\n{0}\r\n==============\r\n", TraceEventType.Error);
// etc
private readonly int id;
private readonly string format;
private readonly TraceEventType type;
private static readonly TraceSource trace = new TraceSource("SyncService");
private LogEvent(int id, string format, TraceEventType type)
{
this.id = id;
this.format = format;
this.type = type;
}
public void Log(params object[] data)
{
var message = String.Format(format, data);
trace.TraceEvent(type, id, message);
}
}
サービス コードでは、ロギング ステートメントに惜しみなく振りかけました。
LogEvent.SyncStart.Log(DateTime.Now);
LogEvent.SyncError.Log("What the??? -- " + e.Message);
LogEvent.SyncStop.Log(DateTime.Now);