¿Cuáles son las configuraciones mejores o más útiles para iniciar sesión con NLog? (Estos pueden ser simples o complejos, siempre que sean útiles).
Estoy pensando en ejemplos como pasar automáticamente los archivos de registro a un cierto tamaño, cambiar el diseño (mensaje de registro) si hay una excepción o no, aumentar el nivel de registro una vez que se ha producido un error, etc.
Aquí hay algunos enlaces:
Respuestas:
Algunos de estos entran en la categoría de consejos generales de NLog (o registro) en lugar de estrictamente sugerencias de configuración.
Aquí hay algunos enlaces de registro generales desde aquí en SO (puede que ya haya visto algunos o todos estos):
log4net vs. Nlog
Registro de mejores prácticas
¿Cuál es el punto de una fachada de tala?
¿Por qué los registradores recomiendan usar un registrador por clase?
Use el patrón común de nombrar su registrador en función de la clase
Logger logger = LogManager.GetCurrentClassLogger()
. Esto le brinda un alto grado de granularidad en sus registradores y le brinda una gran flexibilidad en la configuración de los registradores (control global, por espacio de nombres, por nombre de registrador específico, etc.).Utilice registradores que no estén basados en el nombre de clase cuando corresponda. Tal vez tenga una función para la que realmente quiera controlar el registro por separado. Tal vez tenga algunas preocupaciones transversales de registro (registro de rendimiento).
Si no utiliza el registro basado en el nombre de clase, considere nombrar sus registradores en algún tipo de estructura jerárquica (tal vez por área funcional) para que pueda mantener una mayor flexibilidad en su configuración. Por ejemplo, puede tener un área funcional de "base de datos", un FA de "análisis" y un FA "ui". Cada uno de estos puede tener subáreas. Por lo tanto, puede solicitar registradores como este:
Y así. Con los registradores jerárquicos, puede configurar el registro globalmente (el "*" o registrador raíz), por FA (Base de datos, Análisis, UI) o por subárea (Database.Connect, etc.).
Los registradores tienen muchas opciones de configuración:
Consulte la ayuda de NLog para obtener más información sobre exactamente lo que significa cada una de las opciones. Probablemente, los elementos más notables aquí son la capacidad de comodín de las reglas de registro, el concepto de que varias reglas de registro pueden "ejecutarse" para una sola declaración de registro, y que una regla de registro puede marcarse como "final" para que las reglas posteriores no se ejecuten para un declaración de registro dada.
Use GlobalDiagnosticContext, MappedDiagnosticContext y NestedDiagnosticContext para agregar contexto adicional a su salida.
Use "variable" en su archivo de configuración para simplificar. Por ejemplo, puede definir variables para sus diseños y luego hacer referencia a la variable en la configuración de destino en lugar de especificar el diseño directamente.
O bien, puede crear un conjunto de propiedades "personalizadas" para agregar a un diseño.
O bien, puede hacer cosas como crear representadores de diseño "día" o "mes" estrictamente a través de la configuración:
También puede usar renders de diseño para definir su nombre de archivo:
Si enrolla su archivo diariamente, cada archivo podría llamarse "Monday.log", "Tuesday.log", etc.
No tenga miedo de escribir su propio renderizador de diseño. Es fácil y le permite agregar su propia información de contexto al archivo de registro a través de la configuración. Por ejemplo, aquí hay un renderizador de diseño (basado en NLog 1.x, no 2.0) que puede agregar Trace.CorrelationManager.ActivityId al registro:
Dígale a NLog dónde están sus extensiones de NLog (qué ensamblaje) de esta manera:
Utilice el renderizador de diseño personalizado de esta manera:
Use objetivos asíncronos:
Y envoltorios de destino predeterminados:
donde corresponda. Consulte los documentos de NLog para obtener más información al respecto.
Dígale a NLog que mire y vuelva a cargar automáticamente la configuración si cambia:
Hay varias opciones de configuración para ayudar a solucionar problemas de NLog
Consulte la Ayuda de NLog para obtener más información.
NLog 2.0 agrega envoltorios LayoutRenderer que permiten que se realice un procesamiento adicional en la salida de un renderizador de diseño (como recortar espacios en blanco, mayúsculas, minúsculas, etc.).
No tenga miedo de envolver el registrador si desea aislar su código de una dependencia dura de NLog, pero ajústelo correctamente. Hay ejemplos de cómo envolver en el repositorio github de NLog. Otra razón para ajustar puede ser que desee agregar automáticamente información de contexto específica a cada mensaje registrado (poniéndolo en LogEventInfo.Context).
Existen ventajas y desventajas para envolver (o abstraer) NLog (o cualquier otro marco de registro para el caso). Con un poco de esfuerzo, puede encontrar mucha información aquí sobre SO presentando ambos lados.
Si está considerando envolver, considere usar Common.Logging . Funciona bastante bien y le permite cambiar fácilmente a otro marco de registro si lo desea. Además, si está considerando ajustar, piense cómo manejará los objetos de contexto (GDC, MDC, NDC). Common.Logging actualmente no admite una abstracción para ellos, pero supuestamente está en la cola de capacidades para agregar.
fuente
NewLine
diseño cumple la tarea. Esto es lo que se me ocurrió. Es mucho más simple de lo que esperaba.Tratar las excepciones de manera diferente
A menudo queremos obtener más información cuando hay una excepción. La siguiente configuración tiene dos objetivos, un archivo y la consola, que filtran si hay o no información de excepción. (EDITAR: Jarek ha publicado sobre un nuevo método para hacer esto en vNext ).
La clave es tener un objetivo de envoltura con
xsi:type="FilteringWrapper" condition="length('${exception}')>0"
fuente
condition="length('${exception}')=0
(o tal vez sea==
) atarget name="file"
.Aparentemente, ahora puedes usar NLog con Growl para Windows .
fuente
Configure NLog a través de XML, pero mediante programación
¿Qué? ¿Sabía que puede especificar el XML NLog directamente a NLog desde su aplicación, en lugar de que NLog lo lea desde el archivo de configuración? Bien tu puedes. Supongamos que tiene una aplicación distribuida y desea utilizar la misma configuración en todas partes. Podría mantener un archivo de configuración en cada ubicación y mantenerlo por separado, podría mantener uno en una ubicación central y llevarlo a las ubicaciones de satélite, o probablemente podría hacer muchas otras cosas. O bien, puede almacenar su XML en una base de datos, obtenerlo al inicio de la aplicación y configurar NLog directamente con ese XML (tal vez revise periódicamente para ver si ha cambiado).
No estoy seguro de cuán robusto es esto, pero este ejemplo proporciona un punto de partida útil para las personas que quieran intentar una configuración como esta.
fuente
<?xml version='1.0' encoding='utf-8' ?><nlog xmlns='http://nlog-project.org/schemas/NLog.xsd' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
Registro de diferentes niveles dependiendo de si hay o no un error
Este ejemplo le permite obtener más información cuando hay un error en su código. Básicamente, almacena los mensajes en el búfer y solo los envía a un cierto nivel de registro (por ejemplo, Advertir) a menos que se cumpla una determinada condición (por ejemplo, ha habido un error, por lo que el nivel de registro es> = Error), luego generará más información (por ejemplo, todos los mensajes de niveles de registro> = Rastreo). Como los mensajes están almacenados en el búfer, esto le permite recopilar información de rastreo sobre lo que sucedió antes se registrara un Error o ErrorException, ¡muy útil!
Adapté este de un ejemplo en el código fuente . Al principio me arrojaron porque dejé de lado
AspNetBufferingWrapper
(ya que la mía no es una aplicación ASP); resulta que PostFilteringWrapper requiere un objetivo almacenado en búfer. Tenga en cuenta que eltarget-ref
elemento utilizado en el ejemplo vinculado anteriormente no se puede utilizar en NLog 1.0 (estoy utilizando 1.0 Actualizar para una aplicación .NET 4.0); Es necesario poner su objetivo dentro del bloque de envoltura. También tenga en cuenta que la sintaxis lógica (es decir, mayor o menor que los símbolos, <y>) tiene que usar los símbolos, no los escapes XML para esos símbolos (es decir,>
y<
) o de lo contrario NLog producirá un error.app.config:
fuente
fileAsCsv
target-ref es solo un artefacto de mis pruebas. Creo que NLog 2 tiene / tuvo problemas con CsvLayouts que NLog 1 / Refresh no tenía.Proporcioné un par de respuestas razonablemente interesantes a esta pregunta:
Nlog: sección de generación de encabezado para un archivo de registro
Agregar un encabezado:
La pregunta quería saber cómo agregar un encabezado al archivo de registro. El uso de entradas de configuración como esta le permite definir el formato del encabezado por separado del formato del resto de las entradas del registro. Use un único registrador, quizás llamado "encabezado registrador" para registrar un solo mensaje al inicio de la aplicación y obtendrá su encabezado:
Defina el encabezado y los diseños de archivo:
Defina los objetivos utilizando los diseños:
Definir los registradores:
Escriba el encabezado, probablemente al principio del programa:
Esta es en gran parte una versión más de la idea "Tratar las excepciones de manera diferente".
Registre cada nivel de registro con un diseño diferente
Del mismo modo, el póster quería saber cómo cambiar el formato por nivel de registro. No estaba claro para mí cuál era el objetivo final (y si se podía lograr de una manera "mejor"), pero pude proporcionar una configuración que hizo lo que pidió:
Nuevamente, muy similar a Tratar las excepciones de manera diferente .
fuente
GlobalDiagnosticsContext
antes.Inicia sesión en Twitter
Basado en esta publicación sobre un Log4net Twitter Appender, Pensé que intentaría escribir un destino NLog Twitter (usando la actualización NLog 1.0, no 2.0). Por desgracia, hasta ahora no he podido obtener un Tweet para publicar realmente con éxito. No sé si hay algo mal en mi código, Twitter, la conexión a Internet / firewall de nuestra empresa, o qué. Estoy publicando el código aquí en caso de que alguien esté interesado en probarlo. Tenga en cuenta que hay tres métodos diferentes de "Publicación". El primero que probé es PostMessageToTwitter. PostMessageToTwitter es esencialmente lo mismo que PostLoggingEvent en la publicación original. Si uso eso, obtengo una excepción 401. PostMessageBasic obtiene la misma excepción. PostMessage se ejecuta sin errores, pero el mensaje aún no está a la altura de Twitter. PostMessage y PostMessageBasic se basan en ejemplos que encontré aquí en SO.
FYI - Acabo de encontrar un comentario de @Jason Diller a una respuesta en esta publicación que dice que Twitter va a desactivar la autenticación básica "el próximo mes". Esto fue en mayo de 2010 y ahora es diciembre de 2010, así que supongo que podría ser la razón por la que esto no funciona.
Configurarlo así:
Dígale a NLog el ensamblado que contiene el objetivo:
Configure el objetivo:
Si alguien prueba esto y tiene éxito, regrese con sus hallazgos.
fuente
Manera más fácil de registrar cada nivel de registro con un diseño diferente usando diseños condicionales
Ver https://github.com/NLog/NLog/wiki/When-Filter para la sintaxis
fuente
Informar a un sitio web / base de datos externo
Quería una manera simple y automática de informar errores (ya que los usuarios a menudo no lo hacen) desde nuestras aplicaciones. La solución más fácil que se me ocurrió fue una URL pública, una página web que podría recibir información y almacenarla en una base de datos, que se envía datos ante un error de la aplicación. (La base de datos podría ser revisada por un desarrollador o un script para saber si hay nuevos errores).
Escribí la página web en PHP y creé una base de datos mysql, usuario y tabla para almacenar los datos. Me decidí por cuatro variables de usuario, una identificación y una marca de tiempo. Las posibles variables (incluidas en la URL o como datos POST) son:
app
(Nombre de la aplicación)msg
(mensaje: por ejemplo, se produjo una excepción ...)dev
(desarrollador - por ejemplo, Pat)src
(fuente: esto vendría de una variable perteneciente a la máquina en la que se estaba ejecutando la aplicación, por ejemplo,Environment.MachineName
o algo así)log
(un archivo de registro o mensaje detallado)(Todas las variables son opcionales, pero no se informa nada si ninguna de ellas está configurada; por lo tanto, si visita la URL del sitio web, no se envía nada a la base de datos).
Para enviar los datos a la URL, utilicé el
WebService
objetivo de NLog . (Tenga en cuenta que tuve algunos problemas con este objetivo al principio. No fue hasta que miré la fuente que me di cuenta de que miurl
no podía terminar con a/
).En general, no es un mal sistema para controlar pestañas en aplicaciones externas. (Por supuesto, lo educado es informar a sus usuarios que informará sobre datos posiblemente confidenciales y darles una forma de optar por la entrada / salida).
Cosas de MySQL
(El usuario db solo tiene
INSERT
privilegios en esta tabla en su propia base de datos).Código del sitio web
(PHP 5.3 o 5.2 con PDO habilitado , el archivo está
index.php
en la/report
carpeta)Código de aplicación (archivo de configuración NLog)
Nota: puede haber algunos problemas con el tamaño del archivo de registro, pero no he descubierto una forma simple de truncarlo (por ejemplo, el
tail
comando de la * nix ).fuente
url
: InnerException: System.InvalidCastException Message = Conversión no válida de 'System.String' a 'System.Uri'. Fuente = mscorlib StackTrace: en System.Convert.DefaultToType (valor IConvertible, tipo targetType, proveedor IFormatProvider) en System.String.System.IConvertible.ToType (tipo de tipo, proveedor IFormatProvider) en System.Convert.ChangeType (valor de objeto, tipo conversionType , Proveedor IFormatProvider)Iniciar sesión desde Silverlight
Al usar NLog con Silverlight, puede enviar el seguimiento al lado del servidor a través del servicio web proporcionado . También puede escribir en un archivo local en el Almacenamiento aislado, que es útil si el servidor web no está disponible. Vea aquí para más detalles, es decir, use algo como esto para convertirse en un objetivo:
fuente