Quantcast
Channel: 黑暗執行緒
Viewing all articles
Browse latest Browse all 2311

取得NLog檔案路徑

$
0
0

NLog已是平日寫.NET專案的標準配備(另一個是Json.NET,每個專案都要加,恨不得.NET能把它納入內建),但偶爾需要確認Log檔路徑(不確定NLog.config寫法是否有錯,設定是否生效),每次遇到每次重新爬文,記性之差,讓網友直呼太誇張,只好寫篇筆記救救自己。

例如有NLog.config寫法如下:(順便筆記我最常用的NLog檔案設定樣式)

<?xmlversion="1.0"encoding="utf-8" ?>
<nlogxmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<targetxsi:type="File"name="f"fileName="e:/AfaConsoleLog/${logger}/${shortdate}.log"
layout="${longdate} ${uppercase:${level}} ${message}"/>
</targets>
<rules>
<loggername="*"minlevel="Debug"writeTo="f"/>
</rules>
</nlog>

要取得f Target產生的檔案路徑,做法是先用FindTargetByName取得 f Target轉型為FileTarget型別,但由於Log檔路徑與Logger名稱及日期有關,故要用FileName.Render()傳入日期及Logger名稱參數才能得到結果。以上可濃縮成一行:

(LogManager.Configuration.FindTargetByName("f") as NLog.Targets.FileTarget).FileName
.Render(new LogEventInfo() { TimeStamp = DateTime.Now, LoggerName = "loggerName" })

趁著偵錯中斷,丟進Visual Studio的立即執行視窗可當場取值,例如:"e:/AfaConsoleLog/loggerName/2015-12-08.log"

若要省事,可以寫成共用函式丟進通用程式庫,呼叫方法可再簡化為 MyUtility.ProbeNLogFilePath("f");

/// <summary>
/// 偵測NLog檔案路徑及名稱 REF: http://stackoverflow.com/a/11629408
/// </summary>
/// <param name="targetName">目標名稱</param>
/// <param name="loggerName">Logger名稱</param>
/// <returns></returns>
publicstaticstring ProbeNLogFilePath(string targetName, string loggerName = "LoggerName")
{     
return (NLog.LogManager.Configuration.FindTargetByName(targetName) as NLog.Targets.FileTarget)
    .FileName.Render(new LogEventInfo() { TimeStamp = DateTime.Now, LoggerName = loggerName });
}

Viewing all articles
Browse latest Browse all 2311

Trending Articles