2012-04-24 11 views
21

Esta es la primera vez que uso el paquete NLog para iniciar sesión, pero hasta ahora ha sido genial trabajar con él.reconfigurando NLog programáticamente

En mi escenario, necesito inicializar mi configuración de NLog LoggingConfiguration programáticamente en lugar de a través del escenario de archivo de configuración más típico. Probé esto y lo puse todo en funcionamiento de la manera que prefiero. ¿Pero cómo voy a modificar mi configuración programáticamente en tiempo de ejecución? Probablemente el escenario más común aquí es uno en el que el nivel de registro de la aplicación se establece en ERROR de manera predeterminada, pero surge un error en un módulo particular de que quiero cambiar el nivel de registro para que sea mucho más detallado para rastrear el error. Me gustaría escribir una pequeña interfaz web para que pueda ajustar fácilmente estas configuraciones en tiempo de ejecución, pero quiero asegurarme de que estoy tomando el enfoque correcto con esto.

+0

Tenga en cuenta que cambiar el nivel mínimo a 'Trace' podría hacerse simplemente con la configuración XML sin reiniciar la aplicación. – Julian

Respuesta

-1

La forma típica de reconfigurar NLog mientras se ejecuta su aplicación es utilizar un archivo de configuración (como NLog.config). Puede definir su configuración de registro en el archivo y puede decirle a NLog que mire el archivo. Si el archivo se modifica (como cambiar el nivel de registro para uno o más registradores), NLog se reconfigurará a sí mismo en función del contenido del archivo.

Usted declara que está configurando programáticamente NLog, por lo que confiar en la capacidad de reconfigurarse en función de un cambio en el archivo de configuración no es una solución viable.

pude reformular su pregunta a algo como esto:

En mi aplicación tengo una variable miembro que inicializar a 10 en el constructor. Esta variable miembro controla el número de veces que mi aplicación debe realizar un ciclo hasta que se cierre. Mientras mi programa se está ejecutando, me gustaría cambiar este valor para que se repita más veces o menos veces. ¿Alguien sabe cómo puedo modificar una variable miembro en tiempo de ejecución?

El problema es similar al tuyo. ¿Cómo iniciar, desde el exterior, un cambio en su aplicación en ejecución? No creo que esto sea específicamente para usar NLog.

Creo que este problema es difícil de resolver a menos que externalice su configuración de registro de alguna manera.

Si usa su propio archivo de configuración u otro archivo, entonces básicamente está duplicando lo que NLog ya hace con su opción de archivo de configuración.

Si emplea algún tipo de mecanismo de sondeo (tal vez con su aplicación revise periódicamente una ubicación (archivo, registro, ???) y luego cambie la configuración de NLog si hay algún indicador de que la configuración de NLog debería cambiar. se almacenaría en esta ubicación? El nuevo nivel de registro? ¿Tiene un solo registrador para toda su aplicación? ¿O tiene el registrador estático único más típico por clase? Si este último, necesita la capacidad de poder especificar qué registrador desea modificar y a qué cambiar el nivel.

Quizás podría comunicarse directamente con su aplicación a través de algún tipo de comunicación compartida de estado o interproceso. Parece mucho trabajo.

Bien podría ser que estoy malinterpretando lo que está tratando de hacer y que realmente hay una manera fácil de lograrlo.

En general, yo diría que hay dos maneras de utilizar Nlog, cada uno con ventajas y disavantages:

archivos

Config

  • Ventajas

    fácil de usar.

    Muy poco código específico de NLog en su aplicación.

    La configuración del registro se puede cambiar mientras se ejecuta la aplicación.

  • Desventajas

    Tienen que mantenerse al día con el archivo de configuración.

    Es posible que no desee que nadie más pueda perder el tiempo con su registro.

configuración mediante programación

  • Ventajas

    no tiene que mantenerse al día con el archivo de configuración.

    Otras personas no pueden perder el tiempo fácilmente con su registro.

  • Desventajas

    Más Nlog código específico de la aplicación.

    No se puede cambiar la configuración de su NLog mientras su aplicación se ejecuta con algún invento de su parte.

    En realidad, no puede cambiar su configuración de NLog después de que su aplicación haya sido compilada sin modificar su código fuente y volver a compilar.

No sé si esto ayudó en todo ...

+1

¿De verdad? Es tan incómodo de usar? Estoy sorprendido de eso, por qué no tienen métodos simples que son como ReconfigureLogger ("LoggerName") o RecofnigureAllLoggers() para reconstruir la configuración actual después de que la modificación sea un completo misterio ... si pueden hacerlo en el cambio. de un archivo de configuración ¿cómo puede ser alguna vez diferente programáticamente? Solo es cuestión de disparar un evento configChanged para notificar al registrador (es) que necesita actualizar su configuración. Entonces, ¿es la única solución que uso un archivo de configuración y lo sobrescribo en tiempo de ejecución para forzar una actualización? Parece una solución realmente hackeada – snappymcsnap

+0

No puedo decir qué tan fácil o difícil es reconfigurar la configuración de registro de NLog mediante programación. Sospecho que no es muy difícil. Sin embargo, ¿cómo planeaba comunicarse desde fuera de su aplicación que su código dentro de su aplicación debería incluso reconfigurar NLog? Ese es el ángulo desde el que vengo. No podía imaginar cómo ibas a decir (desde el exterior) tu aplicación en ejecución que querías reconfigurar el registro en primer lugar. Realmente creo que la mayoría de las personas que desean que su registro sea reconfigurable, mientras su aplicación ... – wageoghe

+0

... se está ejecutando, use la opción de archivo de configuración. – wageoghe

53

Sé que tengo un año de retraso pero me encontré con un escenario similar en el que necesitaba proporcionar un control dinámico del registrador a los usuarios. Afortunadamente, esto es relativamente fácil con nlog. Aquí solo estoy habilitando el registro de nivel de rastreo en un registrador ya creado, pero obviamente puede hacer lo que quiera, incluso agregar nuevos objetivos/reglas o simplemente reemplazar por completo la configuración de registro con la generada programáticamente.

Basic ColoredConsole nlog.config:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <targets> 
    <target xsi:type="ColoredConsole" name="c" 
      layout="${longdate} ${uppercase:${level}} ${message}" /> 
    </targets> 
    <rules> 
    <logger name="*" minlevel="Error" writeTo="c" /> 
    </rules> 
</nlog> 

simple aplicación de consola:

public class Program 
{ 
    //Initialize default Logger from config file 
    private static readonly Logger m_log = LogManager.GetCurrentClassLogger(); 

    public static Logger Log 
    { 
     get { return m_log; } 
    } 

    public static void Main(string[] args) 
    { 
    Log.Trace("You won't see me because config is at LogLevel.Error"); 
    EnabledTraceForAllRules(); 
    Log.Trace("You will see me now though!"); 

    //Pause console window 
    Console.WriteLine("Press any key to continue..."); 
    Console.ReadKey(true); 

    /* Prints: 
    2013-05-07 16:04:22.7050 TRACE You will see me now though! 
    Press any key to continue... 
    */ 
    } 

    public static void EnabledTraceForAllRules() 
    { 
    foreach(var rule in LogManager.Configuration.LoggingRules) 
    { 
     rule.EnableLoggingForLevel(LogLevel.Trace); 
    } 

    //Call to update existing Loggers created with GetLogger() or 
    //GetCurrentClassLogger() 
    LogManager.ReconfigExistingLoggers(); 
    } 
} 

Si es necesario modificar la configuración de registro desde fuera del proceso y que se tiene que hacer mediante programación, sugeriría ir con WCF. Puede exponer un pequeño servicio WCF desde su aplicación o sitio web que proporciona métodos para reconfigurar nlog.

+0

Esto se debe marcar como anwer – Julian

+0

Sugeriría un servicio websocket para este uso, será menos pesado y más fácil de usar que Wcf. – Thomas

+0

'LogManager.ReconfigExistingLoggers();' es la clave aquí. Sin esto, no podrás agregar el objetivo/regla de registro –

Cuestiones relacionadas