接受和监控事件日志

PowerShell 监听事件日志 3


网友@精彩人生 提问:”我想把我的日志,主动发送到另外一台计算机,而不是让另外一台计算机主动要获取我电脑上日志,有没有办法做到”。

这里有两个关键字:

主动:我所理解的主动是,类似于实时监听,一有日志,我就发送

发送:要运东西,卡车,火车,还是飞机,选择太多了,自己选择吧:PowerShell远程文件传输,其实还有很多很多,可以自己谷歌。

回到本篇主题:实时监听事件日志,实时监控事件日志,有两种方式:

  1. 设置一个时间增量,比如每隔5分钟去查询事件日志,把五分钟之内产生的事件日志做处理,比较通用,但是缺点很明显。缺点一:效率低,比如我有1个小时根本没产生日志,但是程序还得自己运行12次。缺点二,就是时间戳判断,稍不留神,可能会遗漏,或者会重复计算,Get-EventLog命令就够了,不是本章重点。
  2. 实时监听,“一有事件,我就汇报”。使用Windows事件查看器的时候,稍微留心就会发现,每当有新的事件产生时,就会提示:“应用程序 事件数2597 可用的新事件”。其实就是EntryWrittenEventHandler( Occurs when an entry is written to an event log on the local computer.)

打开一个控制台A敲入:

$EventListenerDef=@"
namespace PStips.Net
{
    using System;
    using System.Diagnostics;
    public class EventListener
    {
        public string EventName { private set; get; }
        public string EventSource { private set; get; }
        private EventLog log;
        public EventListener(string eventName, string eventSource)
        {
            log = new EventLog(eventName);
            log.Source = eventSource;
            log.EnableRaisingEvents = true;
            log.EntryWritten += log_EntryWritten;
        }

        void log_EntryWritten(object sender, EntryWrittenEventArgs e)
        {
            Console.WriteLine("New Event Recieved:Id={0},Message={1},Time={2}",e.Entry.InstanceId,e.Entry.Message,e.Entry.TimeGenerated);
        }
    }
}
"@
Add-Type -TypeDefinition $EventListenerDef
New-Object PStips.Net.EventListener -ArgumentList 'Application','EventCreate'

再打开另外一个控制台B敲入:

1..5 | foreach {
 EVENTCREATE /T ERROR /ID 1000 /L APPLICATION /D "PowerShell 中文博客正在测试:,第 $($_) 次测试"
}

此时控制台B上回显示:

 

生成事件日志

生成事件日志

此时控制台A上会显示:

接受和监控事件日志

接受和监控事件日志

答疑:上面代码为什么不用PowerShell直接用C#,我用PowerShell没有测试成功,估计是那个委托事件EntryWritten的传递有问题,求原谅。

最后你想邮件通知,还是发送都其它服务器,还是保存成txt,随你的便吧!

本文链接: https://www.pstips.net/monitoring-eventlog.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

3 条评论 “PowerShell 监听事件日志