3

在测试 log4net EventLogAppender 期间,我一直在与 Windows 事件日志作斗争,但行为不一致,我意识到,log4net 代码有效,但我的 Windows 事件日志是不合理的。

系统

  • 操作系统:Windows 8.1
  • C#:.Net 4.5,基于 x64 构建

创建错误案例

  • C#:在 TestLog1 中创建 Source1
  • C#:写入日志(作品)
  • Powershell:使用 powershell 删除日志
  • C#在TestLog2中创建Source1(不同的日志)
  • C# 写入日志 <= 这显示 TestLog2 中没有日志条目!

我已经制作了一个完整的分步指南来重新创建问题:

1:在新日志中创建新源并写入

执行的代码:

EventLog.CreateEventSource(source: "TestSource1", logName: "TestLog1");
EventLog myLog = new EventLog();
myLog.Source = "TestSource1";
myLog.WriteEntry("This is a message");

使用 powershell 命令列出日志:

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");

结果:

  • 列出所有日志时,日志出现在 powershell 中
  • 日志不包含任何条目
  • 即使它出现在日志列表中,使用 Get-EventLog "TestLog2" 也会引发异常
  • 使用 remove-eventlog -logName "TestLog2" 以某种方式删除 powershell 中的日志仍然有效。

似乎在某些情况下,日志似乎存在,但在其他情况下则不存在。

A:这是一个已知的错误还是我的方案有什么问题?

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);
4

1 回答 1

4

不幸的是,您不能“背靠背”重新注册事件源。这是安装人员经常要求重新启动计算机的(许多)原​​因之一。

来自 MSDN:

如果源已映射到日志并且您将其重新映射到新日志,则必须重新启动计算机才能使更改生效。

EventLog.CreateEventSource 方法(字符串,字符串)

为了解决这个问题,我建议不要删除事件源,除非产品被卸载。只需停止使用 Log1 并开始使用 Log2,无需删除和重新创建。当你去使用任何日志时,你可以使用类似这样的东西:

if (!EventLog.SourceExists(source, log))
{
    EventLog.CreateSource(source, log)
}

并且只需将源留在原处,直到您卸载产品。如果您使用的是 InstallShield,它应该会自动检测是否需要重新启动并要求用户这样做。

于 2015-01-19T09:35:28.583 回答