在创建事件源之后立即设置事件日志属性

时间:2011-03-24 15:50:47

标签: c# logging event-log

我有一些代码可以创建一个新的事件源:

EventLog.CreateEventSource(Source, LogName);

我知道创建它有延迟。我想设置一些默认的EventLog属性。我正在考虑以下几点:

EventLog log = new EventLog();
log.Source = Source;
log.MaximumKilobytes = 16384;
log.ModifyOverflowPolicy(OverflowAction.OverwriteAsNeeded, 0);

是否有一些创造性的方法同时做到这一点?

我想我可以定期检查EventLog.Exists(...),直到它返回true,但似乎必须有一个更清洁的方式。

2 个答案:

答案 0 :(得分:4)

这篇文章很老了,但我是通过搜索google来到这里的,并认为这可能很有用。

如果 您正在创建事件日志源(而不是新的事件日志),则您使用ModifyOverflowPolicy应用的设置实际上是整体事件日志,而不是您刚刚创建的来源。

因此你应该能够这样做:

string LogName = "Application";
EventLog.CreateEventSource(Source, LogName);

EventLog log = new EventLog(LogName);
log.MaximumKilobytes = 16384;
log.ModifyOverflowPolicy(OverflowAction.OverwriteAsNeeded, 0);

属性log.Source仅在您要写入日志时使用:http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.source.aspx

否则,您可以编写信息日志(例如,创建事件日志)以强制创建日志:

  

在写入第一个条目之前,不会创建日志。   http://msdn.microsoft.com/en-us/library/2awhba7a.aspx

答案 1 :(得分:1)

试过这个,据我所知,只需设置最大文件大小就不需要ModifyOverflowPolicy()调用。此外,即使调用接受较低的值,最小大小似乎也是1 MB。任何可接受的值都存储在注册表中(以字节为单位),但GUI和测试显示1028 kB是最小值。值得注意的是GetEventLogs()调用返回从注册表派生的大小,而不是实际的1 MB限制。

if (!System.Diagnostics.EventLog.SourceExists(this.eventSourceName))
{
    System.Diagnostics.EventLog.CreateEventSource(this.eventSourceName, this.eventLogName);
    if (!string.IsNullOrEmpty(this.eventLogMaxSizeKB))
    {
        System.Diagnostics.EventLog myEventLog = new System.Diagnostics.EventLog(this.eventLogName);
        long RoundedToLowest64k = (long.Parse(this.eventLogMaxSizeKB) / 64) * 64;
        myEventLog.MaximumKilobytes = RoundedToLowest64k;
    }
}

在Windows 7 64位和2008 R2 64位上测试。 我还注意到实际文件大小比你设置的大4 kB。在GUI中,最小尺寸可见1028 kByte,但所有较大的值都是64的倍数:)