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 registradorDataIntakeServiceno está configurado explícitamente, por lo que hereda esta configuración.El registrador
EventLogAppenderestá configurado explícitamente para iniciar sesión enEventLogAppendery está configurado para no heredar la configuración de los registradores principales (additivity="false"). Por lo tanto, no se registra enLogFileAppender. Si estableceadditivity="true", heredará la configuración y se registrará tanto enLogFileAppendercomo enLogFileAppender.
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");