54 votes

c # écriture dans l'observateur d'événements

J'essaie d'écrire dans l'observateur d'événements dans mon code c #, mais je reçois le merveilleux message "Référence d'objet non définie à une instance d'objet". J'apprécierais un peu d'aide avec ce code, que ce soit son problème ou même un meilleur moyen 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;
    }
}
 

87voto

Brian Rudolph Points 3403

Le problème est probablement que vous cherchez à créer une source de l'événement dans un journal qui n'existe pas. Vous devez spécifier la "Demande" du journal.

Essayez de la remplacer par:

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

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

Aussi: à l'Intérieur de sharepoint, si l'application est en cours d'exécution que l'utilisateur connecté(via l'authentification windows ou délégation), l'utilisateur n'aura pas accès à créer la source de l'événement. Si c'est le cas, une astuce consiste à créer l'événement à l'aide d'un pool de threads thread, qui lors de sa création, auront le contexte de sécurité de l'utilisateur de l'Application de la Piscine est en cours d'exécution.

22voto

Nelson Points 311

Voici comment j'ai mis en place la journalisation des Événements. J'ai créé un générique ILogger interface de sorte que je peux échanger dans les 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);
}

Mon implémentation de la classe 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'ai pas l'instancier le Journal des événements. Pour utiliser mon enregistreur de classe, j'ai juste la référence suivante (vous pourriez avoir cette retourné en statique méthode de fabrique):

private static readonly ILogger log = new EventLogger();

Et l'usage réel qui est comme ceci:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X