c#写入事件查看器

我试图写在我的C#代码的事件查看器,但我得到了美妙的“对象引用未设置为对象的实例”消息。 我会很感激这个代码的一些帮助,无论是什么错误,甚至更好的方式来做到这一点。 以下是我写入事件日志的内容:

private void WriteToEventLog(string message) { string cs = "QualityDocHandler"; EventLog elog = new EventLog(); if (!EventLog.SourceExists(cs)) { EventLog.CreateEventSource(cs, cs); } elog.Source = cs; elog.EnableRaisingEvents = true; elog.WriteEntry(message); } 

以下是我想要调用的地方:

 private readonly Random _rng = new Random(); private const string _chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private string RandomString(int size) { try { char[] buffer = new char[size]; for (int i = 0; i < size; i++) { buffer[i] = _chars[_rng.Next(_chars.Length)]; } return new string(buffer); } catch (Exception e) { WriteToEventLog(e.ToString()); return null; } } 

问题可能是您正在尝试在不存在的日志中创build事件源。 您需要指定“应用程序”日志。

尝试将其更改为:

 if (!EventLog.SourceExists(cs)) EventLog.CreateEventSource(cs, "Application"); EventLog.WriteEntry(cs, message, EventLogEntryType.Error); 

另外:在SharePoint内部,如果应用程序以login用户身份运行(通过Windows身份validation或委托),用户将无权访问创build事件源。 如果是这样的话,一个技巧就是使用ThreadPool线程来创build事件,创build该线程时将具有运行App池的用户的安全上下文。

以下是我如何实现事件日志logging。 我创build了一个通用的ILogger接口,所以我可以交换不同的日志logging机制:

 interface ILogger { void Debug(string text); void Warn(string text); void Error(string text); void Error(string text, Exception ex); } 

我的实现类非常简单:

 class EventLogger : ILogger { public void Debug(string text) { EventLog.WriteEntry("MyAppName", text, EventLogEntryType.Information); } public void Warn(string text) { EventLog.WriteEntry("MyAppName", text, EventLogEntryType.Warning); } public void Error(string text) { EventLog.WriteEntry("MyAppName", text, EventLogEntryType.Error); } public void Error(string text, Exception ex) { Error(text); Error(ex.StackTrace); } } 

请注意,我没有实例化EventLog。 要使用我的logging器类,我只需要下面的引用(你可以通过静态工厂方法返回):

 private static readonly ILogger log = new EventLogger(); 

实际的用法是这样的:

 try { // business logic } catch (Exception ex) { log.Error("Exception in MyMethodName()", ex); } 
  private void WriteEventLogToFile() { try { using (EventLog eventLog = new EventLog("Application")) { // source for your event eventLog.Source = "IAStorDataMgrSvc"; // Syntax details // eventLog.WriteEntry("details",type of event,event id); eventLog.WriteEntry("Hard disk Failure details", EventLogEntryType.Information, 11); } } catch (Exception) { throw; } }