在测试log4net EventLogAppender期间,我一直在与Windows事件日志争吵很多小时并且行为不一致,我意识到log4net代码工作正常,但是我的Windows事件日志是不合理的。
系统
创建错误案例
我已经制作了一个完整的分步指南来重新创建问题:
1:在新日志中创建新来源并写入
执行代码:
EventLog.CreateEventSource(source: "TestSource1", logName: "TestLog1");
EventLog myLog = new EventLog();
myLog.Source = "TestSource1";
myLog.WriteEntry("This is a message");
使用powershell-command列出日志:
Get-EventLog -LogName *
这将正确列出所有日志,包括包含1个日志条目的TestLog1。 我也可以使用这个powershell命令获取日志条目:
GetEventLog -LogName "TestLog1"
这显示了日志中的单个日志消息。
2:使用powershell删除事件日志
Powershell命令:
Remove-EventLog -LogName "TestLog1"
现在列出所有日志,显示日志实际已被删除。 Powershell再次命令:
Get-EventLog -LogName *
3:再次创建源,但这次在另一个日志中
执行代码:
EventLog.CreateEventSource(source: "TestSource1", logName: "TestLog2"); // New log name
EventLog myLog = new EventLog();
myLog.Source = "TestSource1";
myLog.WriteEntry("This is a message");
结果:
似乎在某些情况下,日志似乎存在,但在其他情况下它并不存在。
答:这是一个已知错误或我的方案有什么问题吗?
B:如果指向旧日志的某些资源仍然存在,我怎样才能清理现有的混乱? (如果是这样,那就是)
编辑:我甚至尝试使用以下C#代码先删除源代码然后再删除日志,但结果是一样的:
var source = "TestSource6";
var logName1 = "Testlog5";
var logName2 = "Testlog6";
EventLog.CreateEventSource(source: source, logName: logName1);
new EventLog() { Source = source }.WriteEntry("This is a message in log " + logName1);
EventLog.DeleteEventSource(source:source);
EventLog.Delete(logName:logName1);
EventLog.CreateEventSource(source: source, logName: logName2);
new EventLog() { Source = source }.WriteEntry("This is a message" + logName2);
答案 0 :(得分:4)
很遗憾,您无法重新注册事件来源"背靠背"。这是安装程序经常要求重启计算机的众多原因之一。
来自MSDN:
如果源已映射到日志并将其重新映射到新日志,则必须重新启动计算机才能使更改生效。
EventLog.CreateEventSource Method (String, String)
为了解决问题,我建议不要删除事件源,除非卸载产品。只需停止使用Log1并开始使用Log2,而无需删除和重新创建。当你去使用任何日志时,你可以使用类似的东西:
if (!EventLog.SourceExists(source, log))
{
EventLog.CreateSource(source, log)
}
只需将源保留原样,直到卸载产品为止。如果您正在使用InstallShield,它应该会自动检测是否需要重新启动,并要求用户这样做。