在不同的事件日志中创建以前删除的源不起作用
Creating previously deleted source in different event log doesnt work
在 log4net EventLogAppender 测试期间,我一直在与 Windows 事件日志斗争很多小时,行为不一致,我意识到,log4net 代码有效,但我的 windows 事件日志是那个不讲道理
系统
- OS: 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 中删除日志仍然有效。
似乎在某些情况下,日志似乎存在,但在其他情况下却不存在。
答:这是已知错误还是我的场景有什么问题?
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);
很遗憾,您无法重新注册事件源 "back to back"。这是安装程序经常要求重新启动计算机的(许多)原因之一。
来自 MSDN:
If a source has already been mapped to a log and you remap it to a new log, you must restart the computer for the changes to take effect.
EventLog.CreateEventSource Method (String, String)
为了解决这个问题,我建议除非卸载产品,否则不要删除事件源。只需停止使用 Log1 并开始使用 Log2,无需删除和重新创建。当你去使用任何日志时,你可以使用类似这样的东西:
if (!EventLog.SourceExists(source, log))
{
EventLog.CreateSource(source, log)
}
并且只需将源保留在原处,直到您卸载该产品。如果您使用的是 InstallShield,它应该会自动检测是否需要重新启动并要求用户这样做。
在 log4net EventLogAppender 测试期间,我一直在与 Windows 事件日志斗争很多小时,行为不一致,我意识到,log4net 代码有效,但我的 windows 事件日志是那个不讲道理
系统
- OS: 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 中删除日志仍然有效。
似乎在某些情况下,日志似乎存在,但在其他情况下却不存在。
答:这是已知错误还是我的场景有什么问题?
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);
很遗憾,您无法重新注册事件源 "back to back"。这是安装程序经常要求重新启动计算机的(许多)原因之一。
来自 MSDN:
If a source has already been mapped to a log and you remap it to a new log, you must restart the computer for the changes to take effect.
EventLog.CreateEventSource Method (String, String)
为了解决这个问题,我建议除非卸载产品,否则不要删除事件源。只需停止使用 Log1 并开始使用 Log2,无需删除和重新创建。当你去使用任何日志时,你可以使用类似这样的东西:
if (!EventLog.SourceExists(source, log))
{
EventLog.CreateSource(source, log)
}
并且只需将源保留在原处,直到您卸载该产品。如果您使用的是 InstallShield,它应该会自动检测是否需要重新启动并要求用户这样做。