C# 如何调用EventLog
工作原理:
? ? ?1.在沒(méi)有指定logname,僅僅指定了source的時(shí)候。
? ? ? 1.1 source存在
? ? ? ?在寫(xiě)eventlog的時(shí)候,首先去找source,如果找到的話,就往這個(gè)source所在的log里面寫(xiě)日志。
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,然后自動(dòng)創(chuàng)建一個(gè)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沒(méi)有指定,默認(rèn)會(huì)使用Application
if (GetLogName(currentMachineName) == null)
this.logName = "Application";
然后自動(dòng)創(chuàng)建一個(gè)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也不存在
? ? ? ? ? ? ? ? ? ? 那么會(huì)自動(dòng)創(chuàng)建log和source,然后寫(xiě)log
? ? ? ? ? ? 2.1.2 logname存在
? ? ? ? ? ? ? ? ? ?那么會(huì)在log下自動(dòng)創(chuàng)建source,然后寫(xiě)log
? ? ? 2.2 source存在
? ? ? ? ? ? 那么這個(gè)source肯定有對(duì)應(yīng)的log了,要么不指定log,讓系統(tǒng)自動(dòng)去匹配。上面的1.1
? ? ? ? ? ? 如果要指定log的話,那么必須指定為正確的,否則會(huì)拋出異常
? ? ?3. source沒(méi)有指定
? ?這個(gè)是不允許的
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);}}}?
左側(cè)欄里面的叫做LogName,每一條event log中的source列,對(duì)應(yīng)的是source
?
EventLog.Entries
?這里的entries是指event log,比如上圖中對(duì)應(yīng)有5個(gè)。
?
?
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
總結(jié)
以上是生活随笔為你收集整理的C# 如何调用EventLog的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android及java中list循环添
- 下一篇: 邬贺铨:区块链技术将确保物联网隐私和安全