2011-06-09 3 views
10

Estoy usando Nlog para iniciar sesión desde mi aplicación C#. La siguiente es la sección <targets> de mi Nlog.config:Nombre de archivo fijo de Nlog por sesión de aplicación

<targets> 
    <target name="logfile" xsi:type="File" fileName="..\logs\${date:format=yyyyMMdd_HHmmss}_trg.log" 
    layout="${counter} | ${date:format=yyyy-MM-dd HH\:mm\:ss.ffff} | ${machinename} | ${level:uppercase=true} | ${logger:shortName=true} | ${stacktrace} | ${message:exceptionSeparator=EXCEPTION:withException=true}" 
    keepFileOpen="true"/> 
</targets> 

Para el filename estoy usando ${date:format=yyyyMMdd_HHmmss}_trg.log para nombrar el registro en función de cuándo se creó. Sin embargo, mientras mi aplicación se ejecuta, el registrador crea un nuevo archivo de registro cada segundo. ¿Cómo puedo obligar a Nlog a corregir el nombre del archivo y crear solo un registro por sesión?

+0

tratar este enlace: http://www.sharedcache.com/cms /configuration_nlog.aspx –

Respuesta

9

Aparentemente hay un ${cached} renderizador de diseño que renderizará el diseño una vez y lo reutilizará. https://github.com/nlog/nlog/wiki/Cached-Layout-Renderer

Sin embargo, gracias a @wageoghe por su contribución. Su solución usando el GlobalDiagnosticContext me hizo pensar en pasar otros valores a NLog.config.

+0

FYI: tu enlace nlog wiki se ha roto. – kenny

+0

@kenny Parece que el sitio de NLog se ha actualizado mucho. Pruebe este enlace: https://github.com/nlog/nlog/wiki/Cached-Layout-Renderer – meffordm

+0

¿Alguien tiene un ejemplo usando '$ {cached}'? – drzaus

10

No estoy seguro, pero supongo que NLog comprueba la existencia del archivo de registro, basado en la propiedad del nombre de archivo (que es dinámico ya que está usando el representador de diseño de fecha). Entonces, dado que el nombre del archivo está cambiando (es decir, cada vez que se recupera el valor del nombre del archivo es diferente (o puede ser diferente)), NLog crea un nuevo archivo.

intente utilizar el procesador de diseño shortdate así:

<targets>  
    <target name="logfile" xsi:type="File"  
      fileName="..\logs\${shortdate}_trg.log"  
      layout="${counter} | ${date:format=yyyy-MM-dd HH\:mm\:ss.ffff} | ${machinename} | ${level:uppercase=true} | ${logger:shortName=true} | ${stacktrace} | ${message:exceptionSeparator=EXCEPTION:withException=true}"  
      keepFileOpen="true"/> 
</targets> 

creo que se verá que el nombre del archivo no cambiará (hasta la medianoche).

La clave es que Nlog siempre va a comprobar para ver si existe el archivo (de acuerdo con el valor del nombre de archivo en el momento en que un mensaje de registro se escribe) y creará el archivo si no existe todavía.

Alternativamente, si desea nombrar su archivo de registro con un nombre de archivo más preciso (es decir, que fue creado en alguna fecha en algún momento), puede almacenar esa hora en GlobalDiagnosticContext y usar el renderizador de diseño gdc para ayudar nombra el archivo. Algo como esto:

//Early in your program do something like this: 
NLog.GlobalDiagnosticContext["StartTime"] = DateTime.Now.ToString("yyyyMMdd_HHmmss"); 

En el archivo NLog.config, hacer algo como esto:

<targets>  
    <target name="logfile" xsi:type="File"  
      fileName="..\logs\${gdc:item=StartTime}_trg.log"  
      layout="${counter} | ${date:format=yyyy-MM-dd HH\:mm\:ss.ffff} | ${machinename} | ${level:uppercase=true} | ${logger:shortName=true} | ${stacktrace} | ${message:exceptionSeparator=EXCEPTION:withException=true}"  
      keepFileOpen="true"/> 
</targets> 

Por último, se podría escribir un LayoutRenderer personalizada para poblar la fecha/hora. Obtendría la hora una vez y luego devolvería el mismo valor cada vez.

Se vería algo como esto:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.CompilerServices; 

using System.Globalization; 

using NLog; 
using NLog.Config; 
using NLog.LayoutRenderers; 

namespace MyNLogExtensions 
{ 
    [LayoutRenderer("StartTime")] 
    class StartTimeLayoutRenderer : LayoutRenderer 
    { 
    private DateTime start = DateTime.Now; 

    public StartTimeLayoutRenderer() 
    { 
     this.Format = "G"; 
     this.Culture = CultureInfo.InvariantCulture; 
    } 

    // 
    // In NLog 1.x, LayoutRenderer defines a Culture property. 
    // In NLog 2.0, LayoutRenderer does not define a Culture property. 
    // 
    public CultureInfo Culture { get; set; } 

    [DefaultParameter] 
    public string Format { get; set; } 

    protected override void Append(StringBuilder builder, LogEventInfo logEvent) 
    { 
     builder.Append(start.ToString(this.Format, this.Culture)); 
    } 

    protected override int GetEstimatedBufferSize(LogEventInfo logEvent) 
    { 
     return 10; 
    } 
    } 
} 

En su NLog.config archivo que necesita algo como esto para decir donde las extensiones son:

<extensions> 
    <add assembly="MyAssembly.dll" 
    </extensions> 

Y entonces su configuración de destino se vería algo como esto:

<targets>  
    <target name="logfile" xsi:type="File"  
      fileName="..\logs\${StartTime:format=yyyyMMdd_HHmmss}_trg.log"  
      layout="${counter} | ${date:format=yyyy-MM-dd HH\:mm\:ss.ffff} | ${machinename} | ${level:uppercase=true} | ${logger:shortName=true} | ${stacktrace} | ${message:exceptionSeparator=EXCEPTION:withException=true}"  
      keepFileOpen="true"/> 
</targets> 
1

Creo que de esta manera cambiando el archivo de registro especificado en el archivo de configuración NLog en la función Principal o al principio de su programa. Este es el "archivo de registro" de destino como objetivo de archivo en el archivo de configuración de su ejemplo.

FileTarget target = LogManager.Configuration.FindTargetByName("logfile") as FileTarget; 
String logfile = "..\logs\" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + "_trg.log"; 
target.FileName = logfile; 
4

ejemplo sobre el uso de $ {} caché envoltorio (https://github.com/nlog/NLog/wiki/Cached-Layout-Renderer) para crear el archivo de registro por aplicación del período de sesiones:

<target 
    name="logfile" 
    xsi:type="File" 
    fileName="log-${date:cached=True:format=yyyy-MM-dd HH-mm-ss-fff}.txt" 
/> 
+0

¡Impresionante, gracias! –

Cuestiones relacionadas