我有源“Source401”用于日志“Log401”。我需要将此源用于“Log402”日志并删除日志“Log401”。 (如果我们可以将“Log401”重命名为“Log402”,那也很好。但所有这些都需要以编程方式完成)
使用下面的代码,我收到以下异常。实现它的最佳方法是什么?
源Source401已存在于本地计算机上。
注意:当我删除旧日志时,它工作正常。但事件并没有被创造出来。
更新
来自MSDN
操作系统将事件日志存储为文件。使用EventLogInstaller或CreateEventSource创建新事件日志时,关联文件存储在指定计算机上的%SystemRoot%\ System32 \ Config目录中。通过使用“.evt”文件扩展名附加Log属性的前8个字符来设置文件名。
源在本地计算机上必须是唯一的;新源名称与现有源名称或现有事件日志名称不匹配。每个源一次只能写入一个事件日志;但是,您的应用程序可以使用多个源写入多个事件日志。
CODE
string source = "Source401";
string logName = "Log402";
string oldLogName = "Log401";
string eventName = "Sample Event";
string machineName = ".";
if (!EventLog.Exists(logName, machineName))
{
////Delete old log
//if (EventLog.Exists(oldLogName, machineName))
//{
// EventLog.Delete(oldLogName, machineName);
//}
//Create Source for the Log
EventLog.CreateEventSource(source, logName, machineName);
//Create Event
EventLog eventLog = new EventLog(logName, machineName, source);
eventLog.WriteEntry(eventName);
try
{
eventLog.WriteEntry(eventName, EventLogEntryType.Warning, 234, (short)3);
}
catch (Exception exception)
{
int x = 0;
}
答案 0 :(得分:2)
例外是告诉你完全问题是什么。名为“Source401”的事件源已存在。您正在删除旧的事件日志“Log401”,但您没有删除事件源。
正如the documentation所说:
操作系统将事件日志存储为文件。使用EventLogInstaller或CreateEventSource创建新事件日志时,关联文件存储在指定计算机上的%SystemRoot%\ System32 \ Config目录中。通过使用“.evt”文件扩展名附加Log属性的前8个字符来设置文件名。
源在本地计算机上必须是唯一的;新源名称与现有源名称或现有事件日志名称不匹配。每个源一次只能写入一个事件日志;
此外,这个小金块:
如果源已映射到日志并将其重新映射到新日志,则必须重新启动计算机才能使更改生效。
此外,您可能还想从文档中考虑这一点:
在安装应用程序期间创建新的事件源。这允许操作系统有时间刷新其已注册事件源列表及其配置。如果操作系统没有刷新其事件源列表,并且您尝试使用新源写入事件,则写入操作将失败
最后,您调用的CreateEventSource
方法已被标记为过时,并且自.NET 2.0开始。通常有一个很好的理由将方法标记为过时的。你应该打电话给CreateEventSource(EventSourceCreationData)。
我认为您需要重新考虑使用事件日志的方式。您的应用程序不应该以这种方式创建和删除日志。这不是他们打算如何使用的。