2011-03-11 27 views
12

Estoy tratando de implementar un registro simple usando Nlog Refresh 1.0 para un proyecto de biblioteca de clase. Parece que nlog no crea un archivo de registro cuando se crea una instancia desde un dll.Cómo utilizar NLog para una DLL

¿Hay alguna otra forma de evitar esto?

mi fichero de configuración es el siguiente:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     throwExceptions="true"> 

    <targets> 
     <target name="file" xsi:type="File" fileName="${basedir}/nlog.txt" /> 
     <target name="console" xsi:type="Console" /> 
    </targets> 

    <rules> 
     <logger name="*" minlevel="Info" writeTo="file" /> 
     <logger name="*" minlevel="Info" writeTo="console" /> 
    </rules> 

</nlog> 

Yo sé que no hay nada malo con esta configuración, ya que funciona desde dentro de un proyecto EXE.

Editar: solo para aclarar: No tengo acceso al programa de llamadas que utiliza mi dll como complemento. El programa que llama es, de hecho, outlook que usa mi dll como un complemento. Me gustaría mantener un registro que solo sea relevante para mi dll y que no tenga nada que ver con la perspectiva en sí.

Respuesta

32

tiene que agregar el nlog.config a la ubicación del archivo exe que usa el dll.

Editar: Usted no tiene que modificar el archivo exe sólo tiene que colocar el nlog.config en el mismo directorio, si eso es otra opción que supongo que tendrá que configurar desde el código https://github.com/nlog/NLog/wiki/Configuration-API

+2

He editado mi pregunta, no tengo acceso a la exe que está llamando mi DLL, prefiero que desee configurar el Nlog de withing mi DLL. – Oysio

+2

Esto debe marcarse como la "respuesta" ya que @Petoj ha señalado con precisión que debe usar la API de configuración como solución. ¡Mi voto favorable! – dotnetguy

2

que debiera coloque el fragmento de archivo de configuración como se indica arriba en web.config para aplicaciones web o en la aplicación.config para aplicaciones de Windows. Esto no se hace automáticamente y si su biblioteca de clase tiene un app.config, de todos modos no se usa cuando la biblioteca de clases recibe una llamada de otra aplicación.

+3

nlog admite nlog.config como independiente, por lo que no tiene que agregarlo en el archivo web.config/app.config – Peter

5

NLog buscará un archivo de configuración del exe que incluye su DLL. Por lo tanto, deberá copiar un archivo de configuración para NLog cada vez que desee usar su DLL.

En teoría, este es el patrón de diseño correcto ya que muchas aplicaciones de terceros pueden usar su DLL de diferentes maneras y le gustaría tener los registros de la DLL centralizados con sus registros.

En mi caso (y tal vez su), queríamos asegurarnos al 100% de que los registros de la DLL se guardan usando nuestro propio archivo de configuración, para asegurarnos de que todos los errores fatales son reportados a nuestro SqlServer etc. No quiero que la aplicación de terceros establezca su propia lógica de registro.

Tuvimos el mismo problema cuando NLog (o Log4Net) no pudo encontrar el archivo de configuración, por lo que no se inició ninguna actividad de registro y no se imprimió ningún mensaje de excepción/error de NLog o Log4Net.

La única alternativa es configurar NLog (o Log4Net) en su DLL mediante el código. NLog le proporciona una API de configuración para que pueda deshacerse de los archivos de configuración. Ver NLog configuration API

En mi caso, tengo una clase estática llamada 'Utils' en mi DLL, que se llama desde cualquier clase de terceros que usa mi DLL (por ejemplo, Utils.doSomething()). Así que configurar Nlog en un constructor estático:

static void Utils() // static constructor 
{ 
    // Step 1. Create configuration object 
    var config = new LoggingConfiguration(); 

    // Step 2. Create targets and add them to the configuration 
    var consoleTarget = new ColoredConsoleTarget(); 
    config.AddTarget("console", consoleTarget); 

    var fileTarget = new FileTarget(); 
    config.AddTarget("file", fileTarget); 

    // Step 3. Set target properties 
    consoleTarget.Layout = @"${date:format=HH\:mm\:ss} ${logger} ${message}"; 
    fileTarget.FileName = @"C:\global-logs\logs.txt"; 
    fileTarget.Layout = "${message}"; 
    // Step 4. Define rules 
    var rule1 = new LoggingRule("*", LogLevel.Debug, consoleTarget); 
    config.LoggingRules.Add(rule1); 

    var rule2 = new LoggingRule("*", LogLevel.Debug, fileTarget); 
    config.LoggingRules.Add(rule2); 

    // Step 5. Activate the configuration 
    LogManager.Configuration = config; 
} 
+0

¿Puede explicarnos un poco más? –

+0

Editado. ¿Esto te ayuda? – TheWalkingPanda