Sim*_*son 4 c# logging event-log
我正在使用Windows事件日志记录一些事件.可以为Windows事件日志中的事件分配一些属性.其中一个是EventID.
现在我想使用EventId尝试对相关错误进行分组.我可以为每次调用我的日志记录方法选择一个数字,但这看起来有点单调乏味.
我希望系统自动执行此操作.它将选择一个eventId,它对于发生日志记录事件的代码中的位置是"唯一的".现在,只有65536个唯一的事件ID,因此可能存在冲突,但它们应该很少,以使EventId成为分组错误的有用方法.
一种策略是采用堆栈跟踪的哈希码,但这意味着以下代码中的第一次和第二次调用将生成相同的事件ID.
public void TestLog()
{
LogSomething("Moo");
// Do some stuff and then a 100 lines later..
LogSomething("Moo");
}
Run Code Online (Sandbox Code Playgroud)
我想使用具有GetFileLineNumber方法的StackFrame类来调用调用堆栈.此策略的问题在于它仅在使用调试符号构建时才有效.我也需要它在生产代码中工作.
有没有人有任何想法?
下面是一些代码,您可以使用这些代码生成一个带有我在我的问题中描述的属性的EventID:
public static int GenerateEventId()
{
StackTrace trace = new StackTrace();
StringBuilder builder = new StringBuilder();
builder.Append(Environment.StackTrace);
foreach (StackFrame frame in trace.GetFrames())
{
builder.Append(frame.GetILOffset());
builder.Append(",");
}
return builder.ToString().GetHashCode() & 0xFFFF;
}
Run Code Online (Sandbox Code Playgroud)
frame.GetILOffset()方法调用在执行时给出该特定帧内的位置.
我将这些偏移与整个堆栈跟踪连接起来,为程序中的当前位置提供唯一的字符串.
最后,由于我只有65536个唯一的事件ID,因此逻辑和哈希码对0xFFFF提取最低有效16位.然后该值成为EventId.