2009-07-15 26 views
54

Tôi đang cố gắng viết cho trình xem sự kiện trong mã C# của mình, nhưng tôi nhận được thông báo "Tham chiếu đối tượng không được đặt thành một thể hiện của đối tượng" tuyệt vời. Tôi đánh giá cao một số trợ giúp với mã này, hoặc có gì sai với nó hoặc thậm chí là một cách tốt hơn để làm điều đó. Dưới đây là những gì tôi có để viết vào nhật ký sự kiện:C# viết cho trình xem sự kiện

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

Và đây là nơi mà tôi đang cố gắng để gọi nó là:

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

lỗi nào là lỗi? – NikolaiDante

+0

vui lòng cung cấp dấu vết ngăn xếp –

+1

"Tham chiếu đối tượng không được đặt thành thể hiện của đối tượng" - có nghĩa là bạn đang tham chiếu NULL, hữu ích hơn khi biết dòng mã nơi điều này xảy ra, bởi vì bạn có thể thấy nó đó là NULL mà bạn đang tham chiếu. –

Trả lời

87

Vấn đề có lẽ là rằng bạn đang cố gắng tạo nguồn sự kiện trong nhật ký không tồn tại. Bạn cần chỉ định nhật ký "Ứng dụng".

Hãy thử thay đổi nó để:

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

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

Ngoài ra: Bên trong SharePoint, nếu ứng dụng đang chạy như đăng nhập người dùng (thông qua cửa sổ auth hoặc đoàn), người dùng sẽ không có quyền truy cập để tạo sự kiện nguồn. Nếu đây là trường hợp, một mẹo là tạo sự kiện bằng cách sử dụng luồng ThreadPool, khi được tạo, sẽ có ngữ cảnh bảo mật của người dùng mà App Pool đang chạy.

22

Đây là cách tôi thực hiện tổ chức sự kiện khai thác gỗ. Tôi tạo ra một giao diện ILogger generic vì vậy tôi có thể trao đổi trong cơ chế khai thác gỗ khác nhau:

interface ILogger 
{ 
    void Debug(string text); 

    void Warn(string text); 

    void Error(string text); 
    void Error(string text, Exception ex); 
} 

lớp thực hiện của tôi rất đơn giản:

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

Lưu ý rằng tôi không nhanh chóng EventLog. Để sử dụng lớp logger của tôi, tôi chỉ có tài liệu tham khảo sau đây (bạn có thể có này trả về bởi một phương thức tĩnh):

private static readonly ILogger log = new EventLogger(); 

Và việc sử dụng thực tế là như thế này:

try 
{ 
    // business logic 
} 
catch (Exception ex) 
{ 
    log.Error("Exception in MyMethodName()", ex); 
} 
+11

thats tốt, nhưng nó không có gì để làm với câu hỏi thực tế của mình o.O –

+8

Đúng, nhưng tôi không có stacktrace để làm việc từ. – Nelson

+0

Điều này thực sự đã trả lời được câu hỏi, nếu bạn thêm vào một hàm tạo mặc định 'if (! EventLog.SourceExists (source))' để kiểm tra xem nó có tồn tại không, và 'chuỗi chuỗi const' mà bạn đặt trong mã (hoặc qua prop hoặc constructor override) và tái sử dụng thông qua lớp.Sau đó, mỗi khi bạn khởi tạo lớp EventLogger, nó đảm bảo rằng lỗi thực tế mà OP gặp phải sẽ không xảy ra. Tôi đã sử dụng mã này kết hợp với câu trả lời được chấp nhận. +1 – ppumkin

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; 
     } 
    } 
Các vấn đề liên quan