2009-07-15 19 views
54

Próbuję napisać do przeglądarki zdarzeń w moim kodzie C#, ale otrzymuję komunikat "Odwołanie do obiektu nie jest ustawione na instancję obiektu". Byłbym wdzięczny za pomoc w tym kodzie, albo o to, co jest z nim nie tak, albo nawet o lepszy sposób na zrobienie tego. Oto co mam do zapisu w dzienniku zdarzeń:C# zapisywanie w przeglądarce zdarzeń

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

A oto gdzie próbuję to nazwać:

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

w jakim wierszu jest błąd? – NikolaiDante

+0

proszę podać ślad stosu –

+1

"Odwołanie do obiektu nie jest ustawione na instancję obiektu" - oznacza, że ​​odwołujesz się do wartości NULL, znacznie lepiej jest znać linię kodu, gdzie to się dzieje, ponieważ wtedy możesz zobaczyć, co to jest to jest NULL, do którego się odwołujesz. –

Odpowiedz

87

Problemem jest prawdopodobnie że próbujesz utworzyć źródło zdarzenia w dzienniku, który nie istnieje. Musisz określić dziennik "Aplikacja".

Spróbuj zmienić go na adres:

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

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

również: Wewnątrz SharePoint, jeśli aplikacja jest uruchomiona jako zalogowany użytkownik (poprzez okna uwierzytelniania lub delegacji), użytkownik nie będzie miał dostępu do stworzenia zdarzenia źródło. W takim przypadku jedna sztuczka polega na utworzeniu zdarzenia za pomocą wątku ThreadPool, który po utworzeniu będzie miał kontekst zabezpieczeń dla użytkownika, dla którego pula aplikacji działa.

22

Oto jak I wdrożone rejestrowanie zdarzeń. I stworzył rodzajowy interfejs ILogger więc mogę zamienić w różne mechanizmy rejestrowania:

interface ILogger 
{ 
    void Debug(string text); 

    void Warn(string text); 

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

Moja klasa implementacja jest bardzo prosta:

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

pamiętać, że nie instancję Eventlog. Aby korzystać z klasy rejestratora mam tylko następujące odniesienia (można mieć ten zwrócony przez statycznej metody fabryki):

private static readonly ILogger log = new EventLogger(); 

a rzeczywiste zużycie jest tak:

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

To dobrze, ale to nie ma nic wspólnego z jego rzeczywistym pytaniem o.O –

+8

Prawda, ale nie mam stacktrace do pracy. – Nelson

+0

To by rzeczywiście odpowiedział na pytanie, jeśli dodałeś do domyślnego konstruktora 'if (! EventLog.SourceExists (source)), aby sprawdzić, czy istnieje, i' const string source', które ustawiłeś w kodzie (lub poprzez propr lub constructor override) i ponownie użyć przez całą klasę.Za każdym razem, gdy tworzysz instancję klasy EventLogger, upewniasz się, że rzeczywisty błąd, jakiego doświadczyła OP, nie nastąpi. Użyłem tego kodu w połączeniu z zaakceptowaną odpowiedzią. +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; 
     } 
    } 
Powiązane problemy