• ASP.NET Core 入门教程 10、ASP.NET Core 日志记录(NLog)入门


    一、前言

    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("------
    index:hello world
    ------");
        return Content("Hello World ! -ken.io");
    }
    
    public IActionResult CheckPhone(string phone)
    {
        _logger.LogInformation($"------
    check phone:{phone}
    ------");
        var result = true;
        var message = "pass";
        if (string.IsNullOrWhiteSpace(phone))
        {
            result = false;
            message = "phone number is empty";
            _logger.LogError($"------
    check phone:{message}
    ------");
        }
        else if (phone.Length != 11)
        {
            result = false;
            message = "wrong phone number length";
            _logger.LogWarning($"------
    check phone:{message}
    ------");
        }
        return Json(new { Result = result, Phone = phone, Message = message });
    }
    

    这里日志内容中包含的 转义符在控制台输出时/写入文件时表示换行,这里加入 ---主要是为了日志输出时,方便快速找到我们主动记录的日志。

    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

  • 相关阅读:
    msysgit 上传文件夹,规范化的日常
    第三次作业【补完作业】
    c++我在努力----第三次作业体会
    编程题
    视频课程作业随笔
    HDU 4123 Bob’s Race 树形dp+单调队列
    HDU 4514 湫湫系列故事——设计风景线 树的直径
    POJ 1239 Increasing Sequences 动态规划
    BNUOJ 52318 Be Friends prim+Trie
    HDU 5925 Coconuts 离散化
  • 原文地址:https://www.cnblogs.com/ken-io/p/aspnet-core-tutorial-log-nlog.html
Copyright © 2020-2023  润新知