writeentry write visor source net log example eventos eventlog event escribir createeventsource create c# event-log

write - c#escribiendo al visor de eventos



eventlog.writeentry c# example (3)

Así es como implementé el registro de eventos. Creé una interfaz genérica de ILogger para poder intercambiar diferentes mecanismos de registro:

interface ILogger { void Debug(string text); void Warn(string text); void Error(string text); void Error(string text, Exception ex); }

Mi clase de implementación es muy 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); } }

Tenga en cuenta que no instanciar EventLog. Para usar mi clase de registrador, solo tengo la siguiente referencia (puede hacer que esto sea devuelto por un método de fábrica estático):

private static readonly ILogger log = new EventLogger();

Y el uso real es así:

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

Estoy tratando de escribir al visor de eventos en mi código c #, pero recibo el maravilloso mensaje "Referencia de objeto no configurada en una instancia de un objeto". Apreciaría algo de ayuda con este código, ya sea lo que está mal o incluso una mejor manera de hacerlo. Esto es lo que tengo para escribir en el registro 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); }

Y aquí es donde estoy tratando de llamarlo:

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


Probablemente, el problema es que está intentando crear un origen de eventos en un registro que no existe. Es necesario especificar el registro de "Aplicación".

Intenta cambiarlo a:

if (!EventLog.SourceExists(cs)) EventLog.CreateEventSource(cs, "Application"); EventLog.WriteEntry(cs, message, EventLogEntryType.Error);

Además: dentro de sharepoint, si la aplicación se ejecuta como usuario registrado (a través de la autenticación de Windows o la delegación), el usuario no tendrá acceso para crear el origen del evento. Si este es el caso, un truco es crear el evento utilizando un subproceso ThreadPool que, cuando se crea, tendrá el contexto de seguridad del usuario con el que se ejecuta el grupo de aplicaciones.


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