【问题标题】:What event id to use for my custom event log entries?我的自定义事件日志条目要使用什么事件 ID?
【发布时间】:2009-11-18 12:21:34
【问题描述】:

在记录到 Windows EventLog 时,自定义应用程序是否应使用任何有效事件 ID 范围?或者我可以使用我选择的任何事件 ID (1,2,3,4....)。 P.S,我正在使用 C#.NET 进行开发。

【问题讨论】:

    标签: c# windows event-log


    【解决方案1】:

    EventId 是特定于应用程序的,因此您可以使用任何您喜欢的范围。只需确保记录您使用过的内容和位置,这样您就可以确保不会两次使用 id,或者便于调试。

    但请记住...

    就像亨利福特所说的“你可以有任何你想要的颜色,只要它是黑色的”——你也可以使用你喜欢的任何范围,只要该范围在 0 和 65535 的范围内。

    【讨论】:

    • 其中 65535 是 ushort.MaxValue
    【解决方案2】:

    果然,由作者来定义和跟踪他们使用的事件 ID 及其含义。

    这是一个参考:http://msdn.microsoft.com/en-us/library/e29k5ebc.aspx - 特别有趣的是关于不将带有 IPv6 地址的消息(因为 % 字符)写入事件日志的部分。我打赌你可以使用一个参数来解决这个问题。

    【讨论】:

      【解决方案3】:

      ID 的高位保留用于测试、调试和其他用于开发的标志。可用位是:

      0x0000 - 0xffff

      见:Event Message Structure

      应避免使用高位,但如果您创建自定义源,则低位的所有值都可用。如果您使用系统或预先存在的源,您将发生冲突并可能收到错误消息。消息取自已注册的源消息 DLL 文件。可以使用 SDK 中的消息文件编译器构建自定义消息文件。

      【讨论】:

        【解决方案4】:

        Edit1:我对此进行了测试,但 eventID 不是 32 位的。它只有 16 位。

        eventId 为 Int32,从 -2,147,483,648 到 2,147,483,647

        EventLog.WriteEntry Method (String, String, EventLogEntryType, Int32)
        
        public static void WriteEntry(
            string source,
            string message,
            EventLogEntryType type,
            int eventID
        )
        

        【讨论】:

        • 是的,接受一个int32作为参数,但是如果输入一个不在0到65535范围内的int就会抛出异常。
        • 是的。你说的对。我现在对其进行了测试,我很惊讶 MS 声称它是 32 位...
        • 不幸的是,许多 API 避免使用无符号整数类型。他们是not CLS-compliant
        • 为什么是-1?任何意见?证明?
        【解决方案5】:

        从技术上讲,您可以为此使用 1 - 65536 之间的任何值。

        但是如果你像我一样写了大量冗长的日志,你会发现很难将一堆条目关联在一起,那么我建议每次执行代码时生成一个随机唯一值,你可以识别事件,甚至更好的主意是创建自己的日志和源来使用它,而不是在应用程序日志中写入所有内容。 喜欢

         Random rnd = new Random();
         EventId = rnd.Next(0, 65535);
        

        【讨论】:

        • 可能是因为 eventId 的目的是唯一标识事件的类型。相同类型的所有事件都应具有相同的 id。例如,这允许自动监控可以在某些事件发生时采取某些操作。分配一个随机 ID 违背了这个目的
        • @Pete 当您登录应用程序日志时这是有道理的,尽管这只是一个建议。
        • 虽然跟踪一组事件 ID 需要工作,但生成一个无法追溯到发生位置的随机数似乎很愚蠢。我为我的 PowerShell 脚本所做的是使用报告事件的源文件的行号。当然,这只适用于代码是单个源文件且不跨模块分布的应用程序。
        • @KillerRabbit 假设将代码放在单个文件中本身是愚蠢的,可以将诸如发生位置之类的信息写入日志本身,但是对于模块,可以在日志中定义多个源当日志是自定义的而不是默认的Application 日志时,每个模块。我正在运行一项每天消耗 6 万多条消息的服务,并且这些消息是在模块管道中处理的,因此随机 ID 帮助我识别它们并将它们组合在一起,因为 DateTime 总是相同的
        猜你喜欢
        • 1970-01-01
        • 2020-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-25
        • 1970-01-01
        • 2018-12-30
        • 1970-01-01
        相关资源
        最近更新 更多