web-dev-qa-db-fra.com

c # écrit à l'observateur d'événements

J'essaie d'écrire à l'observateur d'événements dans mon code c #, mais je reçois le merveilleux message "Référence d'objet non définie sur une instance d'un objet". J'apprécierais de l'aide avec ce code, soit ce qui ne va pas, soit même une meilleure façon de le faire. Voici ce que j'ai pour écrire dans le journal des événements:

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

Et voici où j'essaie de l'appeler:

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;
    }
}
54
PushCode

Le problème est probablement que vous essayez de créer une source d'événements dans un journal qui n'existe pas. Vous devez spécifier le journal "Application".

Essayez de le changer en:

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

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

Aussi: à l'intérieur de sharepoint, si l'application s'exécute en tant qu'utilisateur connecté (via l'authentification Windows ou la délégation), l'utilisateur n'aura pas accès pour créer la source d'événement. Si tel est le cas, une astuce consiste à créer l'événement à l'aide d'un thread ThreadPool qui, une fois créé, aura le contexte de sécurité de l'utilisateur sous lequel le pool d'applications s'exécute.

87
Brian Rudolph

Voici comment j'ai implémenté la journalisation des événements. J'ai créé une interface générique ILogger pour pouvoir échanger dans différents mécanismes de journalisation:

interface ILogger
{
    void Debug(string text);

    void Warn(string text);

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

Ma classe d'implémentation est très simple:

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

Notez que je n'instancie pas EventLog. Pour utiliser ma classe d'enregistreur, j'ai juste la référence suivante (vous pouvez la faire renvoyer par une méthode d'usine statique):

private static readonly ILogger log = new EventLogger();

Et l'utilisation réelle est comme ceci:

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