這篇來記錄NLog的設定及基本使用,讓我們在開發過程及維護專案時,有更多資訊可以協助判斷。
首先,下載兩個nuget:
- NLog
- NLog.Schema
裝完後可以看到專案中多了NLog相關檔案
先來做些基本設定,紀錄方式為File,此logger規則為紀錄Debug以上層級(因Debug為最低層級,因此等於所有層級)。
其中fileName定義了Log檔路徑及名稱;Layout則定義了紀錄資訊的格式,也可傳自定義的屬性參數。
<targets>
<!--log檔要儲存的路徑-->
<target xsi:type="File" name="test"
fileName="${basedir}/App_Data/Logs/${shortdate}/${logger}.txt"
layout="${longdate} ${uppercase:${level}} ${message} ${event-properties:Property1} ${event-properties:Property2}" />
</targets>
<rules>
<!--以檔案形式儲存-->
<logger name="*" minlevel="Debug" writeTo="test" />
</rules>
接下來在我們把對logger操作寫在自定義的ActionFilter內,讓logger方便重複使用
public class ActionLogFilter: ActionFilterAttribute
{
private NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var controller = filterContext.Controller.ControllerContext;
var userName = controller.HttpContext.User.Identity.Name;
var ip = controller.HttpContext.Request.UserHostAddress;
var actionName = controller.RouteData.Values["action"];
logger
.WithProperty("Property1", userName)
.WithProperty("Property2", ip)
.Info($"{userName} Request {actionName} Page");
base.OnActionExecuting(filterContext);
}
}
如此,便可直接再controller或action上做註冊
[ActionLogFilter]
public class HomeController : BaseController
{
...
}
或是直接註冊在Global.asax.cs
protected void Application_Start()
{
// 全域註冊
GlobalFilters.Filters.Add(new Filters.NLogFilters.ActionLogFilter());
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
以上,一個簡單的log小秘就完成了,我們可以透過不同層級的logger,將特定資訊或是Exception寫成log檔,如下:
ps. 除了file的方式,NLog亦提供了其他方式,詳見下一篇。
參考資料:
ASP.NET MVC NLog Tutorial
Logging Troubleshooting
使用NLog - Advanced .NET Logging (2)