在不同的事件日志中创建以前删除的源不起作用

时间:2015-01-15 09:56:32

标签: c# powershell eventlog-source

在测试log4net EventLogAppender期间,我一直在与Windows事件日志争吵很多小时并且行为不一致,我意识到log4net代码工作正常,但是我的Windows事件日志是不合理的。

系统

  • 操作系统:Windows 8.1
  • C#:。Net 4.5,内置于x64

创建错误案例

  • C#:在TestLog1中创建Source1
  • C#:写入日志(Works)
  • 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-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");

结果:

  • 列出所有日志时,日志会显示在PowerShell中
  • 日志不包含任何条目
  • 使用Get-EventLog“TestLog2”即使出现在日志列表中也会引发异常
  • 使用remove-eventlog -logName删除powershell中的日志“TestLog2”仍然有效。

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

答:这是一个已知错误或我的方案有什么问题吗?

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

1 个答案:

答案 0 :(得分:4)

很遗憾,您无法重新注册事件来源"背靠背"。这是安装程序经常要求重启计算机的众多原因之一。

来自MSDN:

  

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

EventLog.CreateEventSource Method (String, String)

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

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

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