C# 如何调用EventLog
工作原理:
1.在没有指定logname,仅仅指定了source的时候。
1.1 source存在
在写eventlog的时候,首先去找source,如果找到的话,就往这个source所在的log里面写日志。
EventLog eventLog = new EventLog(); eventLog.Source = $@"LisaEventLog 2018-04-17 18:37:16.907 +08:00"; var message = $"{AppDomain.CurrentDomain.BaseDirectory}{Environment.NewLine}{AppDomain.CurrentDomain.FriendlyName} {DateTimeOffset.Now}"; eventLog.WriteEntry(message, EventLogEntryType.Error); Console.WriteLine($@"{eventLog.Log},{eventLog.Source}");
1.2 source 不存在 (直接绑定Application作为logname,然后自动创建一个source)
https://github.com/dotnet/corefx/
dotnet\corefx\src\System.Diagnostics.EventLog\src\System\Diagnostics\EventLogInternal.cs
private void VerifyAndCreateSource(string sourceName, string currentMachineName)
如果log没有指定,默认会使用Application
if (GetLogName(currentMachineName) == null)
this.logName = "Application";
然后自动创建一个event source
EventLog.CreateEventSource(new EventSourceCreationData(sourceName, GetLogName(currentMachineName), currentMachineName));
EventLog eventLog = new EventLog(); eventLog.Source = $@"{nameof(LisaEventLog)} {DateTimeOffset.Now:yyyy-MM-dd HH:mm:ss.fff zzz}"; var message = $"{AppDomain.CurrentDomain.BaseDirectory}{Environment.NewLine}{AppDomain.CurrentDomain.FriendlyName} {DateTimeOffset.Now}"; eventLog.WriteEntry(message, EventLogEntryType.Error); Console.WriteLine($@"{eventLog.Log},{eventLog.Source}");
2.指定logname和source
2.1 source不存在
2.1.1 logname也不存在
那么会自动创建log和source,然后写log
2.1.2 logname存在
那么会在log下自动创建source,然后写log
2.2 source存在
那么这个source肯定有对应的log了,要么不指定log,让系统自动去匹配。上面的1.1
如果要指定log的话,那么必须指定为正确的,否则会抛出异常
3. source没有指定
这个是不允许的
System.ArgumentException : Source property was not set before writing to the event log.
at System.Diagnostics.EventLogInternal.WriteEntry(String message, EventLogEntryType type, Int32 eventID, Int16 category, Byte[] rawData)
at System.Diagnostics.EventLog.WriteEntry(String message, EventLogEntryType type)
public class LisaEventLog { private readonly string _logName = @"Lisa"; public string LogName => _logName; public LisaEventLog() { } public LisaEventLog(string logName) { _logName = logName; } public void WriteEntry(string error, EventLogEntryType type) { var sourceName = AppDomain.CurrentDomain.FriendlyName; if (!EventLog.SourceExists(sourceName)) { EventLog.CreateEventSource(sourceName, _logName); } using (EventLog eventLog = new EventLog(_logName)) { eventLog.Source = sourceName; var message = $"{AppDomain.CurrentDomain.BaseDirectory}{Environment.NewLine}{error}"; eventLog.WriteEntry(message, type); } } }
左侧栏里面的叫做LogName,每一条event log中的source列,对应的是source
这里的entries是指event log,比如上图中对应有5个。
System.ArgumentException : Only the first eight characters of a custom log name are significant, and there is already another log on the system using the first eight characters of the name given. Name given: 'Application1', name of existing log: 'Application'.
at System.Diagnostics.EventLog.CreateEventSource(EventSourceCreationData sourceData)
at System.Diagnostics.EventLogInternal.VerifyAndCreateSource(String sourceName, String currentMachineName)
at System.Diagnostics.EventLogInternal.WriteEntry(String message, EventLogEntryType type, Int32 eventID, Int16 category, Byte[] rawData)
at System.Diagnostics.EventLog.WriteEntry(String message, EventLogEntryType type)
System.ArgumentException : The source 'klnagent2' is not registered in log 'Application'. (It is registered in log 'Appplicat'.) " The Source and Log properties must be matched, or you may set Log to the empty string, and it will automatically be matched to the Source property.
at System.Diagnostics.EventLogInternal.VerifyAndCreateSource(String sourceName, String currentMachineName)
at System.Diagnostics.EventLogInternal.WriteEntry(String message, EventLogEntryType type, Int32 eventID, Int16 category, Byte[] rawData)
at System.Diagnostics.EventLog.WriteEntry(String message, EventLogEntryType type)
at ExcelTest.Test.TestEventLog() in D:\ChuckLu\Git\Edenred\LISA_5.0.0.0\ExcelTest\Test.cs:line 692
作者:Chuck Lu GitHub |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了