取得NLog檔案路徑
1 |
NLog已是平日寫.NET專案的標準配備(另一個是Json.NET,每個專案都要加,恨不得.NET能把它納入內建),但偶爾需要確認Log檔路徑(不確定NLog.config寫法是否有錯,設定是否生效),每次遇到每次重新爬文,記性之差,讓網友直呼太誇張,只好寫篇筆記救救自己。
例如有NLog.config寫法如下:(順便筆記我最常用的NLog檔案設定樣式)
排版顯示純文字
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target xsi:type="File" name="f" fileName="e:/AfaConsoleLog/${logger}/${shortdate}.log"
layout="${longdate} ${uppercase:${level}} ${message}" />
</targets>
<rules>
<logger name="*" 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>
public static string 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 });
}
Comments
# by Akito
我也常忘記路徑怎麼設定Orz (老了嗚嗚嗚嗚嗚) 謝謝大大分享~