C# 当EventLogEntry.Index达到MaxInt时会发生什么?

C# 当EventLogEntry.Index达到MaxInt时会发生什么?,c#,.net,C#,.net,我正在使用eventlog.Entries(c#.NET 4.0)读取应用程序eventlog,以获取EventLogEntry对象并处理它们。当新事件写入eventlog时,EventLogEntry.Index属性似乎总是在增长。清除事件日志不会重置EventLogEntry.Index 当EventLogEntry.Index达到maxint时会发生什么?操作系统是否重置过索引 我正在编写一个将在服务器(win2008R2)上运行的服务,我必须假设将有很多事件记录正在进行。最终可能会达到2

我正在使用eventlog.Entries(c#.NET 4.0)读取应用程序eventlog,以获取EventLogEntry对象并处理它们。当新事件写入eventlog时,EventLogEntry.Index属性似乎总是在增长。清除事件日志不会重置EventLogEntry.Index

当EventLogEntry.Index达到maxint时会发生什么?操作系统是否重置过索引


我正在编写一个将在服务器(win2008R2)上运行的服务,我必须假设将有很多事件记录正在进行。最终可能会达到21亿,然后会发生什么?

通过Windows API从的
RecordNumber
字段获取
EventLogEntry.Index
属性

明确指出:

EVENTLOGRECORD的RecordNumber成员包含记录编号 用于事件日志记录。写入事件的第一条记录 日志是记录编号1,其他记录按顺序编号。 如果记录编号达到ULONG_MAX,则下一个记录编号将为 0,而不是1;但是,您可以使用零来查找记录

请注意,
ULONG_MAX
是一个“C”预处理器值,实际上相当于C#的
uint.MaxValue
,但这听起来可能令人困惑

还请注意,不幸的是,
EventLogEntry.Index
将此
uint
返回为
int
,因此当它超过2^31时将变为负值

如果要确保它正常工作,可能需要将其强制转换为
uint
,以确保正确处理介于2^31和2^32-1之间的值

具体回答您的问题“EventLogEntry.Index达到MaxInt时会发生什么?”:

MaxInt
之后的下一个索引将是
-2147483648
,然后是
-2147483647
,依此类推,直到它到达
-1
,此时它将换行到
0
,然后开始正常计数


但是,如果您将
int
转换为
uint
,那么索引将从
1
转换为
uint.MaxValue
,然后它将返回到
0

,虽然您应该知道实际发生时会发生什么,但对于如此多的日志记录,您将早已没有实际用途。我仍然会设置一个,以确保您在任何时候都有一个可管理的日志大小。此外,您应该考虑事件日志是否是日志消息的正确接收器。也许另一种技术(日志文件、环形缓冲区等)是更好的解决方案。即使配置了用于覆盖事件的事件日志,为索引提供一个可管理的日志大小,索引仍然会增长。正如我所写的,清除日志不会重置索引。它的实际用途是将所选事件日志存储在SQL Server数据库中,以便进行分析和归档。是的,你说得对。我错过了您问题中的“清除事件日志不会重置EventLogEntry.Index”,抱歉。(事实上,这似乎是真的;考虑到这一点,这是有道理的……)