最初に考えたのおかげで - と、私は完全にまだを介してこれを考えていないが、それは合理的な可能性のように思える:
public class LogEvent
{
/* This is the event code you reference from your code
* so you're not working with magic numbers. It will work
* much like an enum */
public string Code;
/* This is the event id that's published to the event log
* to allow simple filtering for specific events */
public int Id;
/* This is a predefined string format that allows insertion
* of variables so you can have a descriptive text template. */
public string DisplayFormat;
/* A constructor to allow you to add items to a collection in
* a single line of code */
public LogEvent(int id, string code, string displayFormat)
{
Code = code;
Id = id;
DisplayFormat = displayFormat;
}
public LogEvent(int id, string code)
: this(id, code, null)
{
}
public LogEvent()
{
}
}
あなたはその後、ラップイベントマネージャクラスを持つことができますあなたが渡したパラメータに応じてリストを照会するメソッドを提供するイベントのリスト - 例えば:
public class EventManager
{
private List<LogEvent> _eventList;
public LogEvent this[string eventCode]
{
get
{
return _eventList.Where(i => i.Code.Equals(eventCode)).SingleOrDefault();
}
}
public LogEvent this[int id]
{
get
{
return _eventList.Where(i => i.Id.Equals(id)).SingleOrDefault();
}
}
public void AddRange(params LogEvent[] logEvents)
{
Array.ForEach(logEvents, AddEvent);
}
public void Add(int id, string code)
{
AddEvent(new LogEvent(id, code));
}
public void Add(int id, string code, string displayFormat)
{
AddEvent(new LogEvent(id, code, displayFormat));
}
public void Add(LogEvent logEvent)
{
_events.Add(logEvent);
}
public void Remove(int id)
{
_eventList.Remove(_eventList.Where(i => i.id.Equals(id)).SingleOrDefault());
}
public void Remove(string code)
{
_eventList.Remove(_eventList.Where(i => i.Code.Equals(code)).SingleOrDefault());
}
public void Remove(LogEvent logEvent)
{
_eventList.Remove(logEvent);
}
}
それぞれのTraceSourceに対して独立して管理できる定義があります。
var Events = new EventManager();
Events.AddRange(
new LogEvent(1, "BuildingCommandObject", "Building command object from {0}."),
new LogEvent(2, "CommandObjectBuilt", "Command object built successfully."),
new LogEvent(3, "ConnectingToDatabase", "Connecting to {0}."),
new LogEvent(4, "ExecutingCommand", "Executing command against database {0}".),
new LogEvent(5, "CommandExecuted", "Command executed succesfully."),
new LogEvent(6, "DisconnectingFromDatabase", "Disconnecting from {0}."),
new LogEvent(7, "Disconnected", "Connection terminated.")
)
そして、あなたはあなたが割り当てられた意味のある識別子使用してイベントにアクセスすることができます。これはおそらく、あなたのイベント管理を単純化する
var evt = Events["ConnectingToDatabase"];
TraceSource.TraceEvent(TraceEventType.Information, evt.Id, evt.DisplayFormat, otherParams);
または
var evt = Events[1024];
Console.WriteLine("Id: {1}{0}Code: {2}{0}DisplayFormat{3}",
Environment.NewLine, evt.Id, evt.Code, evt.DisplayFormat);
を、あなたは、もはやあなたを呼び出していないしていますイベントをマジックナンバーで簡単に管理することができます。これは、EventManagerクラスの1つのイベントですべてのイベントを簡単に管理でき、フィルタリングする必要があるマジックナンバーでイベントログをフィルタリングできます。ベンの提案のように
イベントログに記録する際にイベントIDを使用しませんでした。私はちょうどその時点で何が起こっていたかについての十分な情報を入れて彼女にリッピングさせてください... – Will
@ウィル - 関連するアイテムを見つけようとしているときに、どのようにイベントログをフィルタリングしますか?たとえば、現在冗長にログを記録しているコンポーネントがありますが、特定のイベントの後ろにいる場合は、そのイベントIDでフィルタリングする唯一の方法です。 – BobTheBuilder
@ウィル - ここでのアイデアは、特定のイベントの出現頻度を項目別に掘り下げて関連するものを見つけることなく評価することです。 – BobTheBuilder