not ejemplo .net logging log4net trace diagnostics

.net - ejemplo - log4net levels



log4net versus TraceSource (5)

En este hilo, muchas personas han indicado que usan log4net. Soy un fan de TraceSources y me gustaría saber por qué se usa log4net.

He aquí por qué me gustan las fuentes de traza:

  • Escuchas conectables - XML, TextFile, Console, EventLog, haz tu propio
  • Interruptores de seguimiento personalizables (error, advertencia, información, detallado, inicio, final, personalizado)
  • Configuración personalizable
  • El Bloque de aplicaciones de registro es solo un gran conjunto de TraceListeners
  • Correlación de actividades / ámbitos (por ejemplo, asociar todos los registros dentro de una solicitud ASP.NET con un cliente determinado)
  • Service Trace Viewer le permite visualizar eventos en contra de estas actividades individualmente
  • Todo es configurable en app.config / web.config.

Dado que .NET Framework usa internamente TraceSources, también me proporciona una forma consistente de configurar el rastreo: con log4net, tengo que configurar log4net y TraceSources.

¿Qué me proporciona log4net que TraceSources no (o que no podría hacerse escribiendo un par de TraceListeners personalizados)?


Aunque solo conozco la forma en que funciona Log4net, una ventaja obvia para usar ese marco es la familiaridad inmediata para aquellos que están acostumbrados a usar log4j.

Otro pequeño beneficio es que el registro de conducción de prueba usando log4net es extremadamente simple; los registradores implementan log4net.ILog. De nuevo, no estoy familiarizado con la solución de Microsoft, pero me pregunto cómo se haría esto sin escribir primero una fachada en la clase System.Diagnostics.Trace.

Con una mirada superficial a la documentación de las fuentes de rastreo, no pude encontrar un equivalente a los diseños, y me interesaría saber si existe ese equivalente. PatternLayout es muy útil para formatear entradas de registro con datos comunes como fechas, información de hilos, contexto de registro, etc. Log4net PatternLayout docs: http://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html

Además, dado que escribir extensiones en un marco de trabajo de registro es probablemente un clásico ''metaproblema'', log4net trae una gran lista de equivalentes de escucha conectables a la tabla.

Lista de appenders: http://logging.apache.org/log4net/release/config-examples.html


Creo que log4net está haciendo todo lo que enumeró para mí.

Los oyentes conectables suenan como apéndices: hay muchos de ellos y, de hecho, incluso pirateé el archivo de registro continuo para terminar siempre en .log (para asociaciones de archivos), agregué un campo de cc al appender del correo electrónico y finalmente sintonicé mis valores favoritos para el apilador de consola de color. Si puedo ser tan audaz, mi felicidad de consola de color:

<appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> <!-- Can Use: Blue Green Red White Yellow Purple Cyan HighIntensity --> <mapping> <level value="FATAL" /> <foreColor value="Yellow, HighIntensity" /> <backColor value="Red" /> </mapping> <mapping> <level value="ERROR" /> <foreColor value="White" /> <backColor value="Purple, HighIntensity" /> </mapping> <mapping> <level value="WARN" /> <backColor value="Blue" /> <foreColor value="White" /> </mapping> <mapping> <level value="INFO" /> <backColor value="Green" /> <foreColor value="White" /> </mapping> <mapping> <level value="DEBUG" /> <foreColor value="White" /> </mapping> <layout type="log4net.Layout.PatternLayout"> <!--<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />--> <!--<conversionPattern value="%-5level %file:%line - %message%newline" />--> <conversionPattern value="%level %logger:%line %newline %message%newline" /> </layout>

Conmutadores de seguimiento personalizables: Log4net solo viene con FATAL ERROR WARN INFO DEBUG para aumentar la verbosidad. El único que realmente echo de menos es AUDITAR para quién hizo qué registro.

Configuración personalizable: utilizo un archivo log4net.config que cargo en tiempo de ejecución (o escribo un registro en c: / gimiendo que no puedo encontrar la configuración).

Try '' Get log4net configuration from file Dim logConfigFile As FileInfo logConfigFile = New FileInfo("./log4net.config") If logConfigFile.Exists Then XmlConfigurator.Configure(logConfigFile) Else CreateEmergenceLogFile(logConfigFile.FullName) End If Catch ex As Exception Console.Out.WriteLine("Could not load the log4net config file") End Try

solo un gran conjunto de TraceListeners: perdón saltándome ese; tomaré su palabra para eso.

Correlación de actividades / ámbitos: ¿quiere decir que cada archivo (clase de lectura) obtiene su propio registro con nombre que puede tener umbrales de nivel de registro por separado? De hecho, puede segmentar el registro incluso en una sola clase (que en realidad puede haber crecido demasiado).

En un archivo de clase:

Private Shared _logger As log4net.ILog = _ log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType) Private Shared _loggerAttribute As log4net.ILog = _ log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName & ".Attribute") Private Shared _loggerCache As log4net.ILog = _ log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName & ".Cache")

Visor de rastreo de servicio: en log4net.config:

<logger name="NipissingU.ADWrapper.EntryTools.Attribute"> <level value="INFO" /> </logger> <logger name="NipissingU.ADWrapper.EntryTools.Cache"> <level value="WARN" /> </logger>

Todo es configurable en app.config / web.config: bueno, tal vez eso sea algo bueno en ASP.NET, no sé, pero cuando hago aplicaciones de conteo de bean de clientes ricos, me gusta un archivo de configuración separado.

Todo aquí es solo mis propios pequeños trucos de uso.

hth, -Mike


En los primeros días (.NET 1.0), el rastreo en .NET Framework era bastante limitado.

Por ejemplo, el particionamiento de TraceSource no llegó hasta .NET 2.0 y usted solo tenía cuatro niveles (Error, Advertencia, Información, Detallado), aunque podría usar media docena de modificadores booleanos para particionar si lo deseaba.

log4j es popular en Java y recibió mucha ayuda para un puerto .NET, y una vez que se hizo popular, se mantuvo de esa manera, aunque las personas ni siquiera lo usan correctamente (por ejemplo, envolverlo en un registrador de singleton y perderlo). es la característica principal).

Aún así, creo que log4net y otros marcos (por ejemplo, NLog, Common.Logging e incluso EntLib) fueron en sentido contrario al implementar su propio sistema de registro desde cero, es decir, cambiar incluso la forma en que se escriben los enunciados de registro.

Hubiera preferido mucho esfuerzo, especialmente desde .NET 2.0, puesto en la extensión de la base sólida de lo que ya está en .NET. Para un proyecto que extiende lo que ya está allí, eche un vistazo al proyecto de Essential Diagnostics en CodePlex ( http://essentialdiagnostics.codeplex.com/ ).

Algunos puntos fuertes de log4net:

  • Es similar a log4j, si ejecuta un entorno mixto y desea un registro constante.

  • La jerarquía del registrador automático que hereda la configuración es bastante clara, en comparación con la cantidad de fuentes de seguimiento que implementa y tiene que configurar cada una. (aunque probablemente exagerado en algunos casos).

  • log4net ya tiene alrededor de 28 apéndices (equivalentes a escuchas de rastreo), mientras que System.Diagnostics solo tiene 10 (pero vea el proyecto Essential.Diagnostics para obtener más información), así que si realmente cree que puede necesitar RemoteSyslogAppender, NetSendAppender, AnsiColorTerminalAppender o TelnetAppender, entonces estas de suerte.

Inconvenientes (en comparación con System.Diagnostics):

  • Debe utilizar una sintaxis de registro diferente, por lo que si ya está utilizando source.TraceEvent (), debe revisar y reemplazar todo.

  • Esto también se extiende a la sintaxis diferente para la correlación, por lo que debe cambiar de CorrelationManager a contextos log4net.

  • No se integra fácilmente con el seguimiento del Marco (por ejemplo, WCF).

  • Soporte deficiente para Event ID''s (necesidad de usar un proyecto de extensión separado IEventLog).

  • Aún no es compatible con Event Tracing para Windows (Vista) o el formato XML de Service Trace Viewer.


La razón por la que prefiero Log4Net para usar Trace uno de targeting - con Log4Net, puedo independientemente instrumentar diferentes capas de mi aplicación (Acceso a datos, Servicios, Business Logic, etc.) y diferentes subsistemas (Autenticación, Procesamiento, etc.) y activar / fuera del registro de cada subsistema de forma independiente.

Esta flexibilidad me permite configurar el registro detallado para un subsistema sin encender el firehose para todo el sistema.

Los métodos estáticos proporcionados en la clase Trace [como TraceInformation ()] no proporcionan ninguna forma de especificar de qué subsistema es el registro, por lo que no es algo fácil de proporcionar al escribir mi propio TraceListener.

Otra razón es el rendimiento: hay una parte de mi aplicación que potencialmente registra varios miles de mensajes por segundo. Log4Net impone una baja sobrecarga. Por el contrario, la última vez que lo miré, el bloque de la aplicación de registro reparsed su configuración XML para cada mensaje registrado, haciendo que el bloque sea muy pesado y lento.


Otra razón para usar TraceSources en lugar de Log4Net es Tracing itself: Log4Net solo se puede usar para el registro (mensajes) pero cómo rastrear un objeto (información múltiple al mismo tiempo). Por supuesto, Log4Net tiene muchos Listeners implementados, pero ¿necesito todo esto? En la mayoría de los casos no. Y si necesito un oyente especial, no es tan difícil implementar el mío propio, ¿no es así? Por ejemplo, necesito que un oyente rastree en una base de datos (no solo mensajes, sino información diferente {cadena, int, etc.} al mismo tiempo).

¿Estoy en lo correcto?