在服务应用程序中我正在迭代Windows应用程序事件日志以解析事件,以便对条目消息进行反应。
在事件日志已满的情况下(Windows通常通过删除旧条目确保有足够的空间 - 这可以在eventvwr.exe
设置中配置),该服务在迭代时总是运行到IndexOutOfBoundsException
EventLog.Entries
集合。无论我如何迭代(for循环,使用集合枚举器,将集合复制到数组中,......),我似乎无法摆脱这个''''。
目前,我确保日志未满,以便通过解析事件日志文件并删除最后几个节点定期删除最后几个项目来保持服务运行(不要打我,我不能'找到更好的选择......)。
如何在不尝试访问已删除的条目的情况下迭代整个集合?
是否有更优雅的方法?我只是尝试访问在最后x
秒内写入的日志(即使LINQ在日志已满时未能选择那些 - 同样的例外),这有用吗?
感谢您提供任何建议和提示
谢
编辑:我忘了提到我的假设是循环正在访问在Windows迭代期间被删除的条目。基本上这就是我试图克隆该集合的原因。有没有办法在我的应用程序中锁定集合一小段时间?
答案 0 :(得分:4)
我也遇到过这种情况,2008R2域控制器更是如此。问题是日志正在换行,因此索引似乎会在您开始迭代事件和到达此时之间发生变化。
除了重试之外似乎没有其他治疗方法。
答案 1 :(得分:1)
从实际角度来看,为什么会出现问题呢?
如果要迭代所有条目,有时当您尝试读取不存在的条目时,您会得到IndexOutOfBoundsException
,然后只是捕获此异常并忽略它。
如果您知道此异常的含义,并且您知道自己想要做什么,只需处理异常并继续工作即可。毕竟,这就是例外......
答案 2 :(得分:0)
如果有人找到这个帖子:
似乎不可能避免这种行为。即使复制集合也会失败并且无法锁定文件(由于系统限制)。 相反,我实现了一个定期检查算法,该算法备份事件日志并以规定的使用百分比(例如95%)清除它,这样就不会发生溢出或删除。