c# .net logging log4net episerver

c# - Forma correcta de usar log4net(nombre del registrador)



.net logging (4)

Hay dos formas de configurar y usar log4net. El primero es cuando puedo configurar mi propio appender y el registrador asociado:

<!-- language: xml --> <appender name="myLogAppender" type="log4net.Appender.RollingFileAppender" > <file value="Logs/myLog.log" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date %level - %message%n" /> </layout> </appender> <logger name="myLog"> <level value="All"></level> <appender-ref ref="myLogAppender" /> </logger>

Y luego, cuando quiero escribir algo en el registro, puedo hacer lo siguiente:

ILog log = LogManager.GetLogger("myLog"); log.Info("message");

Otra forma de usarlo es configurar root para que sea lo más detallado que yo quiera:

<!-- language: xml --> <root> <level value="Error" /> <appender-ref ref="myLogAppender" /> </root>

Y en este caso, puedo registrar mensajes como este:

ILog log = LogManager.GetLogger(typeof(Bar)); log.Info("message");

Los beneficios del segundo enfoque es que puede habilitar o deshabilitar algunos mensajes sobre la marcha. Pero el problema es que estoy desarrollando EPiServer CMS y tiene su propio sistema de registro que usa log4net y si habilito el registro de información en el nivel raíz, se escribirán muchos registros del sistema.

¿Cómo se usa log4net? Cada parte de un sistema escribe en su propio registrador, o todo está escrito en el registrador predeterminado, y la configuración decide qué hacer a continuación.


En cuanto a cómo registrar mensajes dentro del código, optaría por el segundo enfoque:

ILog log = LogManager.GetLogger(typeof(Bar)); log.Info("message");

Donde los mensajes enviados al registro de arriba serán ''nombrados'' usando la barra tipo completamente calificada, por ej.

MyNamespace.Foo.Bar [INFO] message

La ventaja de este enfoque es que es el estándar de facto para organizar el registro, también le permite filtrar sus mensajes de registro por espacio de nombres. Por ejemplo, puede especificar que desea registrar el mensaje de nivel INFO, pero elevar el nivel de registro para Bar específicamente para DEPURAR:

<log4net> <!-- appenders go here --> <root> <level value="INFO" /> <appender-ref ref="myLogAppender" /> </root> <logger name="MyNamespace.Foo.Bar"> <level value="DEBUG" /> </logger> </log4net>

La capacidad de filtrar su registro por nombre es una poderosa característica de log4net, si simplemente registra todos sus mensajes a "myLog" , ¡ "myLog" gran parte de este poder!

Con respecto a EPiServer CMS, debe poder utilizar el enfoque anterior para especificar un nivel de registro diferente para el CMS y su propio código.

Para leer más, aquí hay un artículo del proyecto de código que escribí sobre el registro:


En lugar de nombrar mi clase de invocación, comencé a usar lo siguiente:

private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

De esta manera, puedo usar la misma línea de código en cada clase que usa log4net sin tener que recordar cambiar el código cuando copio y pego. Alternativamente, podría crear una clase de registro, y tener todas las otras clases heredadas de mi clase de registro.


La desventaja del segundo enfoque es un gran repositorio con los registradores creados. Estos registradores hacen lo mismo si se define raíz y los registradores de clase no están definidos. El escenario estándar en el sistema de producción usa pocos registradores dedicados al grupo de clase. Lo siento por mi ingles.


Mi respuesta podría llegar tarde, pero creo que puede ayudar a los novatos. No verá los registros ejecutados a menos que los cambios se realicen de la siguiente manera.

2 Los archivos deben ser cambios cuando implemente Log4net.

  1. Agregue referencia de log4net.dll en el proyecto.
  2. app.config
  3. Archivo de clase donde implementará Registros.

Dentro de [ app.config ]:

En primer lugar, en ''configSections'', debe agregar debajo de la pieza de código;

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />

Luego, en el bloque ''configuración'', debe escribir debajo del código. (Este fragmento de código se personaliza según mi necesidad, pero funciona como un hechizo).

<log4net debug="true"> <logger name="log"> <level value="All"></level> <appender-ref ref="RollingLogFileAppender" /> </logger> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="log.txt" /> <appendToFile value="true" /> <rollingStyle value="Composite" /> <maxSizeRollBackups value="1" /> <maximumFileSize value="1MB" /> <staticLogFileName value="true" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date %C.%M [%line] %-5level - %message %newline %exception %newline" /> </layout> </appender> </log4net>

Clase de llamadas internas :

Dentro de la clase donde va a usar este log4net, necesita declarar debajo del fragmento de código.

ILog log = LogManager.GetLogger("log");

Ahora, ya está listo para iniciar sesión en el registro que desee en esa misma clase. A continuación se muestra uno de los métodos que puede utilizar para realizar operaciones.

log.Error("message");