2011-02-20 39 views
7

Sé que hay algunos niveles de registro incorporadas en Nlog como huella, información, fatal etcNlog y personalizados Niveles

quiero definir algunos nuevos como "dBlog" y poder sólo para configurar todos los registros con dBlog para ser dirigido a un determinado objetivo.

¿Hay alguna manera de hacerlo? o tengo que definir un registro personalizado?

Respuesta

20

@SemVanmeenen tiene razón, NLog no permite agregar niveles personalizados (es decir, ampliar los valores posibles en la clase LogLevel). Además, dada la forma en que funcionan los niveles, al menos en NLog, cada nivel generalmente indica la prioridad del mensaje. Por lo tanto, si tiene algunos (o todos) los registradores configurados para registrar solo el Error y los mensajes de nivel superior, los mensajes Trace, Debug, Info y Warn no se registrarán. ¿Dónde encajaría un nivel DBLog? Parece que sería más una "categoría" (que puede ser algo análoga a los nombres de registradores) en lugar de un nivel.

¿Realmente necesita un nivel especial (o más de uno) para registrar cosas como "DBLog"? ¿Por qué no simplemente definir otro registrador en su archivo de configuración llamado "DBLog"? De esta forma, puede usar el filtrado y los Objetivos para enviar esos registros a un Destino específico o activar o desactivar ese registrador. See this link for some examples of stuff you can do with NLog configuration.

Uno de los patrones más comunes en Nlog y log4net es tener un registrador por clase, así:

class MyClass 
{ 
    private static readonly Logger logger = LogManager.GetCurrentClassLogger(); 

    public void DoSomething(int x, int y); 
    { 
    logger.Info("Doing something. x = {0}, y = {1}", x, y); 

    //Or 

    logger.Log(LogLevel.Info, "Doing something. x = {0}, y = {1}", x, y); 
    } 
} 

También puede utilizar nombres registrador arbitrarias:

class MyDbClass 
{ 
    private static readonly Logger logger = LogManager.GetLogger("DbStuff"); 

    public void DoSomething(int x, int y); 
    { 
    logger.Info("Doing something. x = {0}, y = {1}", x, y); 

    //Or 

    logger.Log(LogLevel.Info, "Doing something. x = {0}, y = {1}", x, y); 
    } 
} 

class MyOtherDbClass 
{ 
    private static readonly Logger logger = LogManager.GetLogger("DbStuff"); 

    public void DoSomething(int x, int y); 
    { 
    logger.Info("Doing something. x = {0}, y = {1}", x, y); 

    //Or 

    logger.Log(LogLevel.Info, "Doing something. x = {0}, y = {1}", x, y); 
    } 
} 

En el segundo ejemplo, ambas clases están utilizando el mismo registrador ("DbStuff") y ambos se pueden controlar (nivel de registro, destino, etc.) en función de ese nombre del registrador.

También podría usar diferentes registradores dentro de la misma clase (quizás por defecto use el estilo de registrador "por clase", pero también define algunos registradores "transversales" para facilitar el registro y el control de información similar a través de las clases). Es posible que tenga un registrador llamado "SQL" o "PERFORMANCE" que utilice ocasionalmente para registrar información específica que le gustaría controlar en un nivel que no sea el de su clase.

Utilizando diferentes nombres de registrador, puede enrutar los mensajes de registro a diferentes destinos sin definir nuevos niveles de registro.

Si esto no ayuda, tal vez podría explicar en detalle su pregunta acerca de lo que quiere hacer exactamente. ¿Qué tipo de código de registro desea que pueda escribir y cree que no puede escribir ahora?

[ACTUALIZACIÓN]

<logger name="Name.Space.Class1" minlevel="Debug" writeTo="f1" /> 
<logger name="Name.Space.Class1" levels="Debug,Error" writeTo="f1" /> 
<logger name="Name.Space.*" writeTo="f3,f4" /> 
<logger name="Name.Space.*" minlevel="Warn" writeTo="f3,f4" /> 
<logger name="Name.Space.*" minlevel="Debug" maxlevel="Error" final="true" /> 

Suponga que f1, f2, f3, f4 y son objetivos de archivo.

La línea 1 hará que el registrador para Class1 escriba en el destino f1 para depuración y mensajes de nivel superior (es decir, se omitirá Trace).

Línea 2 hará que el registrador para Class1 a escribir a la meta f1 sólo los mensajes de depuración y el nivel de error (es decir, Trace, info, warn, y fatal se saltará)

Línea 3 hará que los registradores para todos clases en espacio de nombre Nombre. Espacio para escribir en los destinos f3 y f4 independientemente del nivel.

Línea 4 hará que los madereros para todas las clases en el espacio de nombres Name.Space escribir en objetivos F3 y F4 sólo si el nivel de registro es Advertir o superior (es decir, Trace, depuración y, a la información será omitida)

La línea 5 causará que los registradores de todas las clases en el espacio de nombres Name.Space rechacen cualquier mensaje cuyo nivel esté entre Debug y Error. Son rechazados porque no hay una cláusula writeTo. No se procesan más reglas para los registradores debido a final=true

Estos ejemplos muestran cómo filtrar a nivel de registrador. Puede filtrar más en el nivel de destino utilizando FilteringTargetWrapper. Yo no lo he utilizado, pero hay un ejemplo de configuración de un FilteringTargetWrapper aquí:
Most useful NLog configurations

Tengo estos ejemplos fuera del archivo de ayuda que se incluye con la actualización 1.0 Nlog instalar. Todavía no instalé NLog 2.0 porque estoy en el medio de un proyecto y prefiero esperar hasta que NLog 2.0 salga de la versión beta antes de pasar a él. Si está utilizando NLog 2.0 y el archivo de ayuda no tiene mejores ejemplos que los que se encuentran en el sitio web de NLog, podría considerar instalar al menos la ayuda de NLog 1.0. Puede obtener la ayuda de NLog 1.0 aquí: http://nlog.codeplex.com/releases/view/32601

+0

Problema es que tengo conexiones con un servidor. Hice un registrador para cada "objeto de conexión". Ahora digamos que lo hago logger.trace y lo que registro.warn si quiero filtrar el rastrear (solo) sin mostrar el aviso? – Stacker

+1

Cuando configura sus registradores en el archivo de configuración, puede configurar un minLevel, maxLevel o niveles discretos para cada uno. Por lo tanto, para el registrador "A", puede configurarlo para que solo registre mensajes de rastreo y para el registrador "B", puede configurarlo para registrar solo mensajes de advertencia (o Advertir y disminuir). Agregaré un par de ejemplos a mi respuesta. – wageoghe

+0

+1 para registradores de "corte transversal" –

0

Por lo que sé, imposible. The log level class de nlog ni siquiera tiene un constructor público y solo tiene objetos de nivel de registro estáticos predefinidos (es decir, la información habitual, el seguimiento, etc.).

¿Pero hay una razón por la cual un objetivo solo no es suficiente?