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

来源:https://www.cnblogs.com/ken-io/archive/2019/04/08/aspnet-core-tutorial-log-nlog.html
-Advertisement-
Play Games

本教程主要內容 ASP.NET Core + 內置日誌組件記錄控制台日誌 ASP.NET Core + NLog 按天記錄本地日誌 ASP.NET Core + NLog 將日誌按自定義LoggerName分類記錄到不同目錄 ASP.NET Core + NLog 按文件大小歸檔記錄本地日誌 NLo... ...


一、前言

1、本教程主要內容

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

2、本教程環境信息

軟體/環境說明
操作系統 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.net-core-tutorial/tree/master/chapter-02

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

ASP.NET Core內置日誌組件,可以將日誌輸出在控制台

1、應用程式啟動時配置日誌

修改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,可以減少很多控制台日誌輸出

2、在控制中記錄日誌

修改HomeController.cs,通過構造函數註入ILogger

//需要引入的命名空間
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---主要是為了日誌輸出時,方便快速找到我們主動記錄的日誌。

3、驗證

啟動應用,訪問 localhost:5001,會看到控制台輸出了Hello World

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

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

1、安裝NLog Package

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

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

這裡我安裝的指定版本:4.8.1,如果不指定版本號,預設安裝最新版本。

2、引入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

3、配置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配置文件一般主要包含兩個部分,節點配置日誌寫入目標,節點配置匹配路由到的規則。

 

主要配置項ken.io的說明
${basedir}/logs/${level}/${shortdate}.log 表示在程式運行目錄,分日誌級別按天寫入日誌文件
${longdate}|${level:uppercase=true}|${logger}|${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>

4、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" />

四、NLog使用進階

1、通過自定義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

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

增加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

五、備註

1、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

2、附錄

  • 本文代碼示例

https://github.com/ken-io/asp.net-core-tutorial/tree/master/chapter-10

  • 本文參考

https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1

https://github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-Core-2

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


b恩文首發於我的獨立博客:https://ken.io/note/asp.net-core-tutorial-log-nlog

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • v4.2.4 更新內容:1.增加了對接阿裡物聯網平臺的服務。下載地址:官方下載 6. 增加與阿裡雲物聯網(IOT)對接服務,實現數據交互 6.1 概述 為了滿足業務系統數據上雲的要求,ServerSuperIO集成了對接阿裡雲物聯網的服務。企業級系統建設採用ServerSuperIO作為後臺服務,同 ...
  • 將主埠COM8拆分成 COM1和COM2兩個虛擬埠 COM8接收的消息會傳遞給COM1和COM2 SerialPort spSend;//spSend,spReceive用虛擬串口連接,它們之間可以相互傳輸數據。spSend發送數據 SerialPort spReceive; //spRecei ...
  • 相較於數據,圖表更能直觀的體現數據的變化趨勢。在數據表格中,同一數據值,可能同時代表不同的數據分類,表現在圖表中則是一個數據體現在多個數據分類標簽下。通常生成的圖表一般預設只有一種分類標簽,下麵的方法將通過編程的方式來介紹在Excel中如何來生成含多層分類標簽的圖表。 使用工具:Spire.XLS ...
  • 這是今天下午一個同事問我的問題,如何在靜態類中讀取json配置文件。我當時並沒有告訴他如何如何去做,辦法肯定是有,但是這種編程思維確實得改改了。靜態類、靜態方法不是面向對象編程的最佳實踐。.NET Core已經為了我們提供了一種通過Dependency Injection獲取配置文件的方法。作為開發 ...
  • 持續集成之應用k8s自動部署 Intro 上次我們提到了 "docker容器化及自動化部署" ,這僅僅適合個人項目或者開發環境部署,如果要部署到生產環境,必然就需要考慮很多因素,比如訪問量大瞭如何調整部署,如何更好的應對大併發的情況,如何不停機更新應用,如果想要將Docker應用於具體的業務實現,是 ...
  • 通過前面章節的學習,我們已經對微信的開發有了基本的掌握與熟悉,基本可以上手做複雜的應用了。本篇我們將詳細講解微信消息管理中普通消息的接收與處理。當普通微信用戶向公眾賬號發消息時,微信伺服器將POST消息的XML數據包到開發者填寫的URL上。接收普通消息微信官方文檔參考:[接收普通消息文檔API](... ...
  • 1,環境 .net framework4.7.2,Autofac,Autofac.Mvc5,sql server 2,動機 公司項目用的是ef,之前留下代碼的大哥,到處using,代碼沒有分層,連復用都麽的,真的是夠了。現在要重構原來的系統,本著高效、簡潔、高耦合性的原則採用autofac + da ...
  • 1.5 基於策略的授權 在上篇中,已經講到了授權訪問(authorization)的四種方式。其中Razor Pages授權約定和簡單授權二種方式更像是身份認證(authentication) ,因為只要是合法用戶登錄就能訪問資源。 而角色授權和聲明授權二種方式是真正的授權訪問(authorizat ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...