有没有其他方法可以使用C#从EventLog中获取崩溃的应用程序名称

时间:2017-09-14 03:35:46

标签: c# event-log

我使用下面的C#代码从EventLog获取崩溃的应用程序名称,

EventLog log = new EventLog("Application");
var entries = log.Entries.Cast<EventLogEntry>().Reverse().Where(x => (UInt16)x.InstanceId == 1000 && x.EntryType.ToString() == "Error" && x.Source == "Application Error").Select(x => new
            {
                x.Message,
                x.TimeGenerated

            }).ToList();

问题是x.Message包含一个带有应用程序名称的大字符串(wmiprvse.exe,如下所示),

Faulting application name: wmiprvse.exe, version: 10.0.10586.0, time stamp: 0x5632d443
Faulting module name: svrenumapi100.dll, version: 2009.100.1600.1, time stamp: 0x4bb682e9
Exception code: 0xc0000005
Fault offset: 0x0003a0bf
Faulting process id: 0xcdcc
Faulting application start time: 0x01d32cb6db70fd71
Faulting application path: C:\windows\sysWOW64\wbem\wmiprvse.exe
Faulting module path: C:\Program Files (x86)\Microsoft SQL 
Server\100\Shared\svrenumapi100.dll
Report Id: 7ecb9ccf-40b3-47b3-956e-a8bfbd2ec0f3
Faulting package full name: 
Faulting package-relative application ID: 

我可以搜索在该大字符串中查找应用程序名称,但有没有更好的方法来查找崩溃的应用程序?

1 个答案:

答案 0 :(得分:0)

看起来你可以做的最好的是Source属性,但文档建议由日志应用程序决定它填充源的内容:

  

事件源指示记录事件的内容。它通常是名字   应用程序的名称或应用程序的子组件名称if   应用程序很大。应用程序和服务通常写入   (因此是源代码)应用程序日志或自定义日志。   设备驱动程序通常写入系统日志。

https://msdn.microsoft.com/en-us/library/system.diagnostics.eventlogentry.source(v=vs.110).aspx

您正在寻找的事件类型可能是由操作系统生成并正确填充此事件,或者可能不是。

如果您可以保证应用程序始终在英语语言窗口上运行,则字符串解析就可以了,如果不是,可能会有点困难。