zoukankan      html  css  js  c++  java
  • 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/

     

        dotnetcorefxsrcSystem.Diagnostics.EventLogsrcSystemDiagnosticsEventLogInternal.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

    EventLog.Entries

     这里的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:ChuckLuGitEdenredLISA_5.0.0.0ExcelTestTest.cs:line 692

  • 相关阅读:
    matlab中 数据保留有效位数
    matlab的m程序转执行文件exe
    MFC创建好的对话框如何移植到新程序中
    STM32 ADC转换时间
    MFC修改窗口无标题和标题信息,修改执执行文件图标
    兔子慢的原因
    core2.1独立布署,报错的原因。
    修复安卓的bug
    2018-11-21 ko.pureComputed的使用
    2018-11-17 js的this引起的血案
  • 原文地址:https://www.cnblogs.com/chucklu/p/8856645.html
Copyright © 2011-2022 走看看