c# escrevendo para o visualizador de eventos

estou a tentar escrever para o visualizador de eventos no meu código C#, mas estou a receber a maravilhosa "referência de objecto não definida para uma instância de um objecto" mensagem. Agradecia uma ajuda com este código, ou o que tem de errado com ele, ou uma maneira melhor de o fazer. Eis o que tenho para escrever no diário de Eventos:

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);
}
E é aqui que estou a tentar chamar-lhe:
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;
    }
}
Author: PushCode, 2009-07-15

3 answers

O problema é provavelmente que você está tentando criar uma fonte de eventos em um log que não existe. Precisa de especificar o registo de "Aplicação".

Tenta mudar para:

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

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

Também: dentro do sharepoint, se a aplicação estiver a correr como utilizador logado(através do Windows auth ou da delegação), o utilizador não terá acesso para criar a fonte do evento. Se este for o caso, um truque é criar o evento usando um ThreadPool thread, que quando criado, terá o contexto de segurança de o usuário o Pool de aplicativos está rodando como.

 87
Author: Brian Rudolph, 2009-07-15 19:35:14
Eis como implementei o registo de eventos. Criei uma interface genérica do ILogger para poder trocar em diferentes mecanismos de Registo:
interface ILogger
{
    void Debug(string text);

    void Warn(string text);

    void Error(string text);
    void Error(string text, Exception ex);
}
A minha aula de implementação é muito simples.
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);
    }
}

Note que eu não instanciar EventLog. Para usar a minha classe de logger tenho apenas a seguinte referência (você poderia ter esta devolvida por um método de fábrica estática):

private static readonly ILogger log = new EventLogger();

E a utilização real é assim:

try
{
    // business logic
}
catch (Exception ex)
{
    log.Error("Exception in MyMethodName()", ex);
}
 22
Author: Nelson, 2009-07-15 19:28:48
   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
Author: Dutt93, 2017-02-06 09:14:09