ASP.NET Core 入門教程 十、ASP.NET Core 日誌記錄(NLog)入門

1、前言

一、本教程主要內容

  • ASP.NET Core + 內置日誌組件記錄控制檯日誌
  • ASP.NET Core + NLog 按天記錄本地日誌
  • ASP.NET Core + NLog 將日誌按自定義LoggerName分類記錄到不一樣目錄
  • ASP.NET Core + NLog 按文件大小歸檔記錄本地日誌
  • NLog配置文件經常使用配置項說明

二、本教程環境信息

軟件/環境 說明
操做系統 Windows 10
SDK 2.1.401
ASP.NET Core 2.1.3
IDE Visual Studio Code 1.33.0
瀏覽器 Chrome 73
VS Code插件 版本 說明
C# 1.18.0 提供C#智能感知, .NET Core 調試、編譯等
vscdoe-solution-explorer 0.3.1 提供解決方案視圖
XML Tools 2.4.0 提供XML高亮,格式化、XML樹等

本篇代碼如下代碼進行調整:https://github.com/ken-io/asp...git

2、ASP.NET Core 內置日誌組件使用

ASP.NET Core內置日誌組件,能夠將日誌輸出在控制檯github

一、應用程序啓動時配置日誌

修改Program.cs,在WebHostBuilder構建時配置日誌數據庫

//須要引入的命名空間
using Microsoft.Extensions.Logging;
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .ConfigureLogging(logging =>
                {
                    logging.ClearProviders();
                    logging.SetMinimumLevel(LogLevel.Info);
                    logging.AddConsole();
                });
配置項 說明
ClearProviders() 清除日誌提供程序,一般在引入第三方日誌組件時使用
SetMinimumLevel(LogLevel.Information) 設置日誌級別爲Information
AddConsole() 添加日誌提供程序->控制檯

這裏設置項,主要是SetMinimumLevel(LogLevel.Information),咱們把日誌級別設置爲Information,能夠減小不少控制檯日誌輸出瀏覽器

二、在控制中記錄日誌

修改HomeController.cs,經過構造函數注入ILoggerbash

//須要引入的命名空間
using Microsoft.Extensions.Logging;
private readonly ILogger<HomeController> _logger;

public HomeController(ILogger<HomeController> logger)
{
    this._logger = logger;
}
public IActionResult Index()
{
    _logger.LogInformation("------\r\nindex:hello world\r\n------");
    return Content("Hello World ! -ken.io");
}

public IActionResult CheckPhone(string phone)
{
    _logger.LogInformation($"------\r\ncheck phone:{phone}\r\n------");
    var result = true;
    var message = "pass";
    if (string.IsNullOrWhiteSpace(phone))
    {
        result = false;
        message = "phone number is empty";
        _logger.LogError($"------\r\ncheck phone:{message}\r\n------");
    }
    else if (phone.Length != 11)
    {
        result = false;
        message = "wrong phone number length";
        _logger.LogWarning($"------\r\ncheck phone:{message}\r\n------");
    }
    return Json(new { Result = result, Phone = phone, Message = message });
}

這裏日誌內容中包含的\r\n轉義符在控制檯輸出時/寫入文件時表示換行,這裏加入\r\n---主要是爲了日誌輸出時,方便快速找到咱們主動記錄的日誌。asp.net

三、驗證

啓動應用,訪問 localhost:5001,會看到控制檯輸出了Hello Worldide

aspdotnet-core-log-console-helloworld

訪問 localhost:5001/home/checkphone,將會看到Error日誌函數

aspdotnet-core-log-console-checkphone-errorlog

訪問 localhost:5001/home/checkphone?phone=000,將會看到警告日誌工具

aspdotnet-core-log-console-checkphone-warnlog

訪問 localhost:5001/home/checkphone?phone=16666666666,就只會看到Info級別日誌了性能

aspdotnet-core-log-console-checkphone-infolog

3、ASP.NET Core + NLog 記錄本地日誌

一、安裝NLog Package

在控制檯使用命令安裝NLog包:

//進入項目目錄
cd Ken.Tutorial.Web
//使用命令安裝nlog
dotnet add package NLog.Web.AspNetCore --version 4.8.1

這裏我安裝的指定版本:4.8.1,若是不指定版本號,默認安裝最新版本。

二、引入NLog

修改Program.cs,在WebHostBuilder構建時配置日誌

//須要引入的命名空間
using NLog.Web;
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .ConfigureLogging(logging =>
                {
                    logging.ClearProviders();
                    logging.SetMinimumLevel(LogLevel.Info);
                    logging.AddConsole();
                }).UseNLog();//UseNLog

三、配置NLog

在項目根目錄Ken.Tutorial.Web新建NLog配置文件nlog.config

<?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" autoReload="true">

    <targets>
        <target name="defaultlog" xsi:type="File" keepFileOpen="false" encoding="utf-8"
            fileName="${basedir}/logs/${level}/${shortdate}.log" 
            layout="${longdate}|${level:uppercase=true}|${logger}|${message}" />
    </targets>

    <rules>
        <logger name="*" minlevel="trace" writeTo="defaultlog" />
    </rules>

</nlog>

NLog配置文件通常主要包含兩個部分,<targets>節點配置日誌寫入目標,<rules>節點配置匹配路由到<targets>的規則。

主要配置項 ken.io的說明
${basedir}/logs/${level}/${shortdate}.log 表示在程序運行目錄,分日誌級別按天寫入日誌文件
${longdate}&#124;${level:uppercase=true}|${logger}&#124;${message} 日誌內容格式:時間+日誌級別+LoggerName+日誌內容
<logger name="*" minlevel="trace" writeTo="defaultlog" /> 支持將任意級別、任意LoggerName的日誌寫入target:defaultlog

爲了能讓程序運行時可以讀取到配置文件,須要修改Ken.Tutorial.Web.csproj文件,在生成運行文件到bin文件夾時,也把nlog.config複製過去。在工具欄切換到資源管理器視圖,雙擊文件便可修改:

aspdotnet-core-nlog-config-copytooutputdir

<ItemGroup>
    <Content Update="nlog.config" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

四、NLog測試

啓動應用,分別訪問如下連接:

  • localhost:5001/home/checkphone
  • localhost:5001/home/checkphone?phone=000
  • localhost:5001/home/checkphone?phone=16666666666

而後在資源管理器視圖下,查看bin/Debug目錄,會看到日誌已經按照配置文件的格式生成了對應的日誌目錄及文件。

aspdotnet-core-nlog-outputdir-logdirtree

同時也會發現,nlog.config按照以前的配置也被複制到了程序運行目錄。

  • Info級別日誌

aspdotnet-core-nlog-filelog-infolog

  • Warn級別日誌

aspdotnet-core-nlog-filelog-warnlog

  • Error級別日誌

aspdotnet-core-nlog-filelog-errorlog

這裏Info日誌是比較多的,咱們能夠經過配置rules,只輸出程序自己主動記錄的日誌。

<logger name="Ken.Tutorial.*" minlevel="trace" writeTo="defaultlog" />

4、NLog使用進階

一、經過自定義LoggerName概括日誌

增長NLog配置,根據LoggerName建立目錄

<!--按照LoggerName分類-->
<target name="customlog" xsi:type="File" keepFileOpen="false" encoding="utf-8"
        fileName="${basedir}/logs/${logger}/${shortdate}-${level}.log" 
        layout="${longdate}|${level:uppercase=true}|${logger}|${message}" />
<!--記錄LoggerName以log結尾的日誌-->
<logger name="*log" minlevel="trace" writeTo="customlog" />

HomeController中添加測試概括日誌的Action

public IActionResult TestLog()
{
    var logger = NLog.LogManager.GetLogger("testlog");
    logger.Trace("這是Trace日誌");
    logger.Debug("這是Debug日誌");
    logger.Info("這是Info日誌");
    logger.Warn("這是警告日誌");
    logger.Error("這是錯誤日誌");
    return Content("ok");
}

這裏直接經過NLog.LogManager.GetLogger建立Logger,並無使用內置日誌Microsoft.Extensions.Logging.ILogger的實例,因此能夠自定義LoggerName,另外,咱們在應用啓動時配置的最低日誌級別等也不會對這種方式生效,是能夠輸出Trace、Debug級別的日誌的。

啓動應用,訪問:localhost:5001/home/testlog,而後就能夠在資源管理器界面看到在logs文件夾下按照LoggerName生成的日誌目錄,並按照日誌級別生成了不一樣的日誌文件:

aspdotnet-core-nlog-filelog-groupbyloggername

二、按照日誌文件大小歸檔日誌

增長NLog配置,按照日誌文件大小歸檔

<!--按照日誌文件大小歸檔-->
<target name="archivelog" xsi:type="File" keepFileOpen="false" encoding="utf-8"
    fileName="${basedir}/logs/${logger}/${shortdate}-current.log" 
    archiveFileName="${basedir}/logs/${logger}/${shortdate}.{####}.log"
    archiveAboveSize="1024000"
    archiveNumbering="Sequence"
    maxArchiveFiles="100"
    layout="${longdate}|${level:uppercase=true}|${logger}|${message}" />

這裏配置當日志文件大小在超過約1mb的時候歸檔(這裏偷懶用1000b代替1kb),最多歸檔100個日誌文件,當歸檔日誌文件超過100個時會把最先歸檔的日誌刪除。

定義專屬規則:

<logger name="logmany" minlevel="trace" writeTo="archivelog" />

HomeController中添加測試歸檔日誌的Action

public IActionResult TestLogMany()
{
    var logger = NLog.LogManager.GetLogger("logmany");
    for (int i = 0; i <= 30000; i++)
    {
        logger.Info("ASP.NET Core入門教程,這裏是日誌內容,測試NLog的日誌歸檔功能,ken的雜談(https://ken.io)");
    }
    return Content("ok");
}

這裏爲了方便測試,直接用for循環,連續寫入日誌30000次

啓動應用,訪問:localhost:5001/home/testlogmany,而後就能夠在資源管理器界面看到在logs/logmany文件夾下按照文件大小歸檔的日誌

aspdotnet-core-nlog-filelog-archivelog

5、備註

一、NLog經常使用配置項說明

target節點/屬性 ken.io的說明
target 日誌寫入目標,能夠配置寫入類型、寫入模板、文件名等
name TargetName,須要惟一,在rules節點引用
xsi:type 目標類型,支持文件(File)、數據庫(Database)、郵件(Mail)
keepFileOpen 保持文件打開,不用每次寫入日誌時都打開、關閉文件,由於能夠提升性能,默認值爲:false
encoding 文件編碼,此處配置爲:utf-8
fileName 日誌文件名,包含日誌完整路徑和文件名,支持模板語法/變量
archiveFileName 歸檔日誌文件名,包含日誌完整路徑和文件名,支持模板語法/變量
archiveNumbering 歸檔序號方式
maxArchiveFiles 最大歸檔日誌文件數
layout 日誌內容模板,內置了一些語法/變量
模板語法/變量 ken.io的說明
${basedir} 程序當前運行目錄
${level} 日誌級別
${shortdate} 當前日期,例如:2019-04-05
${longdate} 當前時間,精確到毫秒,例如:2019-04-05 14:10:22.4372
${uppercase:${level}} 把內容格式化成大寫
${logger} LoggerName,日誌記錄器名稱,一般是Logger初始化所在類完整名稱,例如:Ken.Tutorial.Web.Controllers.HomeController
${machinename} 機器名
${message} 日誌內容
rules節點/屬性 ken.io的說明
logger 日誌記錄器路由規則配置
name LoggerName匹配,支持完整匹配和模糊匹配,例如:mylog、Ken.*
minlevel 最低日誌級別
maxlevel 最高日誌級別
level 限制單一的日誌級別
levels 指定一個或多個日誌級別,用,間隔
writeTo 指定一個或多個target,用,間隔
final 在匹配到該規則以後再也不匹配後續規則,默認值:false
enabled 是否啓用該規則,默認值:true

二、附錄

  • 本文代碼示例

https://github.com/ken-io/asp...

  • 本文參考

https://docs.microsoft.com/zh...

https://github.com/NLog/NLog....

https://github.com/nlog/NLog/...


本文後首發於個人獨立博客:https://ken.io/note/asp.net-c...

相關文章
相關標籤/搜索