0%

[DotnetCore]NLog使用

前提情要

筆者因處在比較嚴格的金融業中,撰寫的資訊系統上線後,追蹤系統作業面,只能靠強而有力的Log機制來追縱問題,以利快速找出問題所在,包含sql logap log以及error log,最好發生Error時寄信的方式通知。筆者本身推崇不重新造輪子,基本上訪間已經有很多很成熟的logging框架dotnet core中也不乏候選套件:NLogSeriLogLog4net等等,筆者選擇NLog當作主要Logging機制的底層框架。

內容

安裝NLog相關套件

NLog,屬眾多Log套件其中一種,主要搭配一個nlog.config,依照其設定執行Log作業,因此主要安裝套件如下:

  • NLog
  • NLog.Config
  • NLog.Web.AspNetCore
1
2
3
dotnet add package NLog
dotnet add package NLog.Config
dotnet add package NLog.Web.AspNetCore

NLog.Config設置

安裝完成後編輯nlog.config檔案,記得將其屬性中的Copy To Output Directory選為Copy always選項。主要有兩個區塊要去設定:targets及rules;targets部份則設定輸出形式,可以設定多個;rules部份則設定套用規則。

筆者這邊簡單舉個例子,假設targets部份有兩個輸出形式:檔案及資料庫,rules套用規則部份,我們可以這樣設定,Info等級以上的輸出於檔案中,Error等級以上才需輸出於資料庫中,意即重要錯誤資訊再塞到資料庫中即可,畢竟資料庫空間比較值錢。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?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"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">

<!-- optional, add some variables
https://github.com/nlog/NLog/wiki/Configuration-file#variables
-->
<variable name="myvar" value="myvalue"/>

<!--
See https://github.com/nlog/nlog/wiki/Configuration-file
for information on customizing logging rules and outputs.
-->
<targets>
<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${uppercase:${level}} ${message}" />
</targets>

<rules>
<!-- add your logging rules here -->
<logger name="*" minlevel="Info" writeTo="f" />
</rules>
</nlog>

NLog套用

將NLog初始化於Program.cs中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using NLog.Web;

public class Program {
public static void Main(string[] args) {
// Confi註冊
NLogBuilder.ConfigureNLog("NLog.config").GetCurrentClassLogger();
CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => {
webBuilder.UseStartup<Startup>();
})
.UseNLog();// NLog註冊
}

Client端套用

使用NLog,只要於每個Class最上方宣告

1
2
3
using NLog;

private static readonly Logger _logger = LogManager.GetCurrentClassLogger();

結論

使用NLog超級容易,生態圈也很豐富,要以Database形式存紀錄,或者寄信通知紀錄等等皆有現成的套件可以使用,筆者覺得說它是Loggin入門套件一點也不為過。

參考