2009-07-15 65 views
54

我試圖寫入我的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; 
    } 
} 
+0

什麼行是錯誤? – NikolaiDante 2009-07-15 19:13:39

+0

請提供堆棧跟蹤 – 2009-07-15 19:16:31

回答

87

這個問題可能是您嘗試在不存在的日誌中創建事件源。您需要指定「應用程序」日誌。

嘗試將其更改爲:

if (!EventLog.SourceExists(cs)) 
    EventLog.CreateEventSource(cs, "Application");  

EventLog.WriteEntry(cs, message, EventLogEntryType.Error); 

另外:共享點的內,如果應用程序正在運行作爲登錄的用戶(通過Windows驗證或授權),用戶將無法訪問創建事件資源。如果是這種情況,一個技巧是使用ThreadPool線程創建事件,該線程在創建時將具有App Pool運行所在的用戶的安全上下文。

22

這裏是我是如何實現事件記錄。我創建了一個通用ILogger接口,這樣我就可以在不同的記錄機制交換:

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); 
    } 
} 

請注意,我不實例化事件日誌。用我的記錄器類我只是有以下引用(你可以有一個靜態工廠方法返回的這個):

private static readonly ILogger log = new EventLogger(); 

與實際使用情況是這樣的:

try 
{ 
    // business logic 
} 
catch (Exception ex) 
{ 
    log.Error("Exception in MyMethodName()", ex); 
} 
1
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; 
     } 
    }