gpt4 book ai didi

c# - 唯一 EventId 生成

转载 作者:太空狗 更新时间:2023-10-30 00:29:13 24 4
gpt4 key购买 nike

我正在使用 Windows 事件日志记录一些事件。 Windows 事件日志中的事件可以分配一些属性。其中之一是 EventID。

现在我想使用 EventId 来尝试对相关错误进行分组。我可以为每次调用我所做的日志记录方法选择一个数字,但这似乎有点乏味。

我希望系统自动执行此操作。它会选择一个 eventId,该 eventId 对于代码中发生日志记录事件的位置是“唯一的”。现在,只有 65536 个唯一的事件 ID,因此可能会发生冲突,但它们应该足够少,以使 EventId 成为对错误进行分组的有用方法。

一种策略是获取堆栈跟踪的哈希码,但这意味着以下代码中的第一次和第二次调用将生成相同的事件 ID。

public void TestLog()
{
LogSomething("Moo");
// Do some stuff and then a 100 lines later..
LogSomething("Moo");
}

我想使用具有 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;
}

frame.GetILOffset() 方法调用给出了执行时该特定帧内的位置。

我将这些偏移量与整个堆栈跟踪连接起来,为程序中的当前位置提供一个唯一的字符串。

最后,由于只有 65536 个唯一的事件 ID,我根据逻辑将哈希码与 0xFFFF 进行逻辑运算,以提取最低有效的 16 位。该值随后成为 EventId。

关于c# - 唯一 EventId 生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/951702/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com