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