zoukankan      html  css  js  c++  java
  • .NET 操作 EventLog(Windows事件日志监控)(转载)

    操作Windows日志:EventLog


    如果要在.NET Core控制台项目中使用EventLog(Windows事件日志监控),首先需要下载Nuget包:

    System.Diagnostics.EventLog

    此外执行程序要拥有管理员权限 

    1:事件日志名(logName):“事件查看器”中的每一项,如“应用程序”、“Internet Explorer”、“安全性”和“系统”都是日志(严格地说是日志的显示名字)
    2:事件源:列表中的“来源”,创建时和事件日志相关联;
    3:事件类型:包括“信息”、“错误”等;
     
    基本操作:
    1:创建日志:我没找到直接创建日志的方法,日志应该都是通过下面的创建事件源来间接创建;
    2:创建事件源:静态方法EventLog.CreateEventSource(string sourceName, string LogName); //参数分别表示事件源名和日志名
       功能说明:在某个事件日志中创建事件源,如果事件日志不存在,则自动创建;
    3:删除日志:静态方法EventLog.Delete(string logName);
    4:删除事件源:静态方法EventLog.DeleteEventSource(string sourceName);
    5:判断日志是否存在:静态方法EventLog.Exists(string logName);
    6:判断事件源是否存在:静态方法EventLog. SourceExists (string sourceName);
    7:写日志:使用EventLog类的实例调用方法WriteEntry(string logDesc, EventLogEntryType.Information); //或者EventLogEntryType.Error

    基本用法:

    using System;
    using System.Diagnostics;
    
    namespace Event
    {
        class Program
        {
            static void WriteError()
            {
                //检测Windows日志中是否存在事件源:My Application,如果不存在就创建事件源
                if (!EventLog.SourceExists("My Application"))
                {
                    EventLog.CreateEventSource("My Application", "Application");//创建事件源,事件源名:My Application,事件日志名:Application
                }
    
                var log = new EventLog("Application")//创建日志到事件日志:Application
                {
                    Source = "My Application"//指定日志的事件源:My Application
                };
    
                log.WriteEntry("Error", EventLogEntryType.Error);
            }
    
            static void Main(string[] args)
            {
                WriteError();
    
                Console.WriteLine("Press any key to quit!");
                Console.ReadKey();
            }
        }
    }

    测试:

    using System;
    using System.Diagnostics;
    
    namespace WindowsConsoleApp
    {
        //测试
        public class EnventLogHelper
        {
            private EventLog log;
    
            public EnventLogHelper()
            {
                log = new EventLog();//默认写应用程序日志
            }
            public EnventLogHelper(string name)
            {
                log = new EventLog(name);//指定写入的分类,用户自定义则新建分组。系统保留//"Application"应用程序, "Security"安全, "System"系统
                //或者可以用 log.Log = "Security";指定
            }
    
    
    
            public void WriteToApp()
            {
                try
                {
    
                    log.Source = "我的应用程序";//日志来源
                    log.WriteEntry("处理信息1", EventLogEntryType.Information);//日志类型
                    log.WriteEntry("处理信息2", EventLogEntryType.Information);
                    throw new System.IO.FileNotFoundException("readme.txt文件未找到");
                }
                catch (System.IO.FileNotFoundException exception)
                {
                    log.WriteEntry(exception.Message, EventLogEntryType.Error);
    
                }
            }
    
            public void ReadLog()
            {
                EventLogEntryCollection eventLogEntryCollection = log.Entries;//获取日志collection
                foreach (EventLogEntry entry in eventLogEntryCollection)
                {
                    
                    string info = string.Empty;
    
                    info += "【类型】:" + entry.EntryType.ToString() + ";";
                    info += "【日期】" + entry.TimeGenerated.ToLongDateString() + ";";
                    info += "【时间】" + entry.TimeGenerated.ToLongTimeString() + ";";
    
                    info += "【计算机】" + entry.MachineName + "【来源】" + entry.Source + "【详细信息】" + entry.Message + "【】";
                    //
                    Console.WriteLine(info);
    
                }
            }
    
    
        }
    }

    监控Windows日志增量变化:EventLogWatcher


    using System;
    using System.Diagnostics.Eventing.Reader;
    
    namespace WindowsConsoleApp
    {
        class SubscribeToEventsExample
        {
            static void Main1(string[] args)
            {
                //监控类
                EventLogWatcher watcher = null;
    
                try
                {
                    // Xpath语法筛选目标事件的发生
                    EventLogQuery subscriptionQuery = new EventLogQuery(
                    "Application", PathType.LogName, "*[System/Level=2] or *[System/Level=3]");
    
                    watcher = new EventLogWatcher(subscriptionQuery);
    
                    // 订阅到事件发生时候,触发事件
                    watcher.EventRecordWritten +=
                        new EventHandler<EventRecordWrittenEventArgs>(
                            EventLogEventRead);
    
                    //开始订阅Windows日志
                    watcher.Enabled = true;
    
                    //如果不停止,监控类会不停查询时间发生,直到Enable设置为false
                    for (int i = 0; i < 5; i++)
                    {
                        // Wait for events to occur. 
                        System.Threading.Thread.Sleep(1000);
                    }
    
    
                }
                catch (EventLogReadingException e)
                {
                    Console.WriteLine("Error reading the log: {0}", e.Message);
                }
                finally
                {
                    // 停止监控
                    watcher.Enabled = false;
    
                    if (watcher != null)
                    {
                        watcher.Dispose();
                    }
                }
            }
    
            /// <summary>
            /// 事件触发
            /// </summary>
            public static void EventLogEventRead(object obj, EventRecordWrittenEventArgs arg)
            {
                // Make sure there was no error reading the event.
                if (arg.EventRecord != null)
                {
                    Console.WriteLine("Received event {0} from the subscription.",
                        arg.EventRecord.Id);
                    Console.WriteLine("Description: {0}", arg.EventRecord.FormatDescription());
                    
                    //log.EventId = arg.EventRecord.Id;//系统日志分配的记录ID
                    //log.Source = arg.EventRecord.ProviderName;//来源
                    //log.Level = (int)(arg.EventRecord.LevelDisplayName == "错误" ? WinLogLevelID.ERROR : WinLogLevelID.WARN);
                    //log.TaskName = arg.EventRecord.TaskDisplayName ?? "无";
                    //log.LogMessage = arg.EventRecord.FormatDescription();
                    //log.TimeCreate = arg.EventRecord.TimeCreated ?? DateTime.Now;
                }
                else
                {
                    Console.WriteLine("The event instance was null.");
                }
            }
        }
    }
     
     
     
     
  • 相关阅读:
    乱码问题
    play之路由 routes
    delphi之http通讯
    delphi之socket通讯
    Delphi之ComboBox
    delphi 常用函数
    字节
    EXCEPT
    V_REPORT_AOC_FUEL]
    相同表结构不同记录
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/10029261.html
Copyright © 2011-2022 走看看