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 registradorDataIntakeService
no está configurado explícitamente, por lo que hereda esta configuración.El registrador
EventLogAppender
está configurado explícitamente para iniciar sesión enEventLogAppender
y 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 enLogFileAppender
como 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");