独特的EventId生成

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类来调用调用堆栈.此策略的问题在于它仅在使用调试符号构建时才有效.我也需要它在生产代码中工作.

有没有人有任何想法?

Sim*_*son 5

下面是一些代码,您可以使用这些代码生成一个带有我在我的问题中描述的属性的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.