一、前言
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
 
访问 localhost:5001/home/checkphone,将会看到Error日志
 
访问 localhost:5001/home/checkphone?phone=000,将会看到警告日志
 
访问 localhost:5001/home/checkphone?phone=16666666666,就只会看到Info级别日志了
 
三、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配置文件一般主要包含两个部分, 为了能让程序运行时能够读取到配置文件,需要修改 启动应用,分别访问以下链接: 然后在资源管理器视图下,查看bin/Debug目录,会看到日志已经按照配置文件的格式生成了对应的日志目录及文件。 同时也会发现, 这里Info日志是比较多的,我们可以通过配置rules,只输出程序本身主动记录的日志。 增加NLog配置,根据LoggerName创建目录 在 这里直接通过 启动应用,访问:localhost:5001/home/testlog,然后就可以在资源管理器界面看到在logs文件夹下按照LoggerName生成的日志目录,并按照日志级别生成了不同的日志文件: 增加NLog配置,按照日志文件大小归档 这里配置当日志文件大小在超过约1mb的时候归档(这里偷懒用1000b代替1kb),最多归档100个日志文件,当归档日志文件超过100个时会把最早归档的日志删除。 定义专属规则: 在 这里为了方便测试,直接用for循环,连续写入日志30000次 启动应用,访问:localhost:5001/home/testlogmany,然后就可以在资源管理器界面看到在logs/logmany文件夹下按照文件大小归档的日志 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
 
主要配置项 
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复制过去。在工具栏切换到资源管理器视图,双击文件即可修改: 
<ItemGroup>
    <Content Update="nlog.config" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
4、NLog测试
 
nlog.config按照之前的配置也被复制到了程序运行目录。
 
 
 
<logger name="Ken.Tutorial.*" minlevel="trace" writeTo="defaultlog" />
四、NLog使用进阶
1、通过自定义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中添加测试归纳日志的Actionpublic 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级别的日志的。 
2、按照日志文件大小归档日志
<!--按照日志文件大小归档-->
<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}" />
<logger name="logmany" minlevel="trace" writeTo="archivelog" />
HomeController中添加测试归档日志的Actionpublic 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");
}
 
五、备注
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、附录
            
    
