2011-06-09 58 views
10

我正在使用Nlog從我的c#應用程序登錄。以下是我的Nlog.config的<targets>部分:Nlog每個應用程序會話固定文件名

<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> 

對於我使用${date:format=yyyyMMdd_HHmmss}_trg.log根據創建時就來命名日誌filename。但是,當我的應用程序運行時,記錄器每秒創建一個新的日誌文件。我如何強制Nlog修復文件名並在每個會話中只創建一個日誌?

+0

嘗試此鏈接: http://www.sharedcache.com/cms /configuration_nlog.aspx – 2011-11-07 08:24:18

回答

9

顯然有一個${cached}將呈現一次佈局並重用它的佈局呈現器。 https://github.com/nlog/nlog/wiki/Cached-Layout-Renderer

不過,感謝@wageoghe的輸入。您使用GlobalDiagnosticContext的解決方案讓我考慮將其他值傳遞給NLog.config。

+0

僅供參考:您的nlog wiki鏈接已損壞。 – kenny 2013-05-25 08:13:49

+0

@kenny看起來NLog的網站已經更新了很多。試試這個鏈接:https://github.com/nlog/nlog/wiki/Cached-Layout-Renderer – meffordm 2013-05-28 04:17:54

+0

任何人都有一個使用'$ {cached}'的例子嗎? – drzaus 2013-08-19 20:30:28

10

我不確定,但我的猜測是NLog基於filename屬性(因爲您使用的是日期佈局渲染器是動態的)檢查日誌文件的存在。因此,由於文件名稱正在改變(即每次檢索到文件名稱時它都不同(或可能不同)),NLog會創建一個新文件。

嘗試使用shortdate佈局呈現這樣的:

<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> 

我想你會看到你的文件名不會改變(直到午夜)。

關鍵是NLog會一直檢查文件是否存在(根據文件名爲的值在寫日誌消息的時候),如果文件不存在,將會創建該文件。

或者,如果您想用更精確的文件名命名日誌文件(即它是某個日期某個時間創建的),那麼您可以將該時間存儲在GlobalDiagnosticContext中並使用gdc佈局呈現器來幫助命名文件。事情是這樣的:

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

在你NLog.config文件,做這樣的事情:

<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> 

最後,你可以寫一個自定義LayoutRenderer來填充的日期/時間。它會得到一次,然後每次都返回相同的值。

這將是這個樣子:

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; 
    } 
    } 
} 

在你NLog.config文件,你需要這樣的事要告訴您的擴展名是:

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

然後你的目標配置,看起來像這樣:

<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

我認爲這種方式是通過改變在Main函數的NLog配置文件中指定的日誌文件或在程序的開頭。這是目標「日誌文件」作爲您的示例的配置文件中的文件目標。

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

使用$ {}緩存封裝(https://github.com/nlog/NLog/wiki/Cached-Layout-Renderer)來創建每個應用程序會話日誌文件示例:

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

真棒,謝謝! – 2014-12-04 09:22:16

相關問題