visual studio ejemplo c# log4net-appender

c# - studio - Usando log4net para escribir en diferentes registradores



log4net levels (2)

Estoy usando log4net para hacer mi registro. Me gustaría escribir en un archivo y en el registro de eventos al mismo tiempo.

Por alguna razón, encuentro los mensajes dos veces en mi archivo de registro.

Esta es mi sección de app.config:

<log4net> <root> <level value="INFO" /> <appender-ref ref="LogFileAppender" /> <appender-ref ref="EventLogAppender" /> </root> <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" > <param name="File" value="c:/temp/DIS-logfile.txt" /> <param name="AppendToFile" value="true" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="10" /> <maximumFileSize value="10MB" /> <staticLogFileName value="true" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%date %-5level %logger - %message%newline" /> </layout> </appender> <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> <param name="Indigo.DataIntakeService" value="eventlog" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date %-5level %logger - %message%newline" /> </layout> </appender> </log4net>

En mi código tengo lo siguiente:

private static readonly ILog Log = log4net.LogManager.GetLogger("DataIntakeService"); private static readonly ILog LogEvents = log4net.LogManager.GetLogger("EventLogAppender"); static void Main(string[] args) { log4net.Config.XmlConfigurator.Configure(); } public static void LogInfo(string message) { Log.Info(message); LogEvents.Info(message); }

Se escribe en mi archivo de registro, según lo solicitado, pero los mensajes también deben ir a mi visor de eventos y eso no sucede. También escribe esos mensajes en el archivo de registro.

¿Qué hice mal?


Ha configurado Log4Net para que el registrador raíz registre los anexos del registro de eventos y de archivos. Todos los registradores heredan esta configuración, por lo que tanto los registradores "DataIntakeService" como "EventLogAppender" registran a estos agregadores.

Si no ve los mensajes de registro en el visor de eventos, puede deberse a que su aplicación no tiene permiso para crear el origen del evento.

ACTUALIZAR

¿Cómo puedo configurarlo para que DataIntakeService se registre en el archivo y el otro en el visor de eventos?

Aquí hay una configuración de muestra:

<log4net> <root> <level value="INFO" /> <appender-ref ref="LogFileAppender" /> </root> <logger name="EventLogAppender" additivity="False"> <level value="INFO" /> <appender-ref ref="EventLogAppender" /> </logger> <appender> ...

Con esta muestra:

  • El registrador raíz (y, por tanto, todos los registradores secundarios, a menos que se configure explícitamente de otra manera) se registrará en LogFileAppender . Su registrador DataIntakeService no está configurado explícitamente, por lo que hereda esta configuración.

  • El registrador EventLogAppender está configurado explícitamente para iniciar sesión en EventLogAppender y está configurado para no heredar la configuración de los registradores principales ( additivity="false" ). Por lo tanto, no se registra en LogFileAppender . Si establece additivity="true" , heredará la configuración y se registrará tanto en LogFileAppender como en LogFileAppender .

Por cierto, nombrar un registrador EventLogAppender es quizás un poco confuso: EventLogLogger podría ser un nombre mejor.


Puede usar log4net para escribir en diferentes registradores con la configuración a continuación.

<log4net> <logger name="LogFileLogger"> <level value="INFO" /> <appender-ref ref="LogFileAppender" /> </logger> <logger name="EventLogger"> <level value="INFO" /> <appender-ref ref="EventLogAppender" /> </logger> <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> ... </appender> <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> ... </appender>

Y puedes llamar a los madereros como:

private static readonly log4net.ILog LogFileLogger= log4net.LogManager.GetLogger("LogFileLogger"); private static readonly log4net.ILog EventLogger= log4net.LogManager.GetLogger("EventLogger");