一、前言

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配置文件一般主要包含两个部分,节点配置日志写入目标,节点配置匹配路由到的规则。

主要配置项 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测试

启动应用,分别访问以下链接:

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

然后在资源管理器视图下,查看bin/Debug目录,会看到日志已经按照配置文件的格式生成了对应的日志目录及文件。

同时也会发现,nlog.config按照之前的配置也被复制到了程序运行目录。

  • Info级别日志

  • Warn级别日志

  • Error级别日志

这里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生成的日志目录,并按照日志级别生成了不同的日志文件:

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文件夹下按照文件大小归档的日志

五、备注

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

ASP.NET Core 入门教程 10、ASP.NET Core 日志记录(NLog)入门的更多相关文章

  1. ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 基础教程总结 ASP.NET Core 基础教程总算是有了个简单 ...

  2. 【译】ASP.NET MVC 5 教程 - 10:添加验证

    原文:[译]ASP.NET MVC 5 教程 - 10:添加验证 在本节中,我们将为Movie模型添加验证逻辑,并确认验证规则在用户试图使用程序创建和编辑电影时有效. DRY 原则 ASP.NET M ...

  3. ASP.NET Core 基础教程-约定 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 基础教程-约定 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 基础教程-约定 因为 ASP.NET Core 是可以跨平台的 ...

  4. Serilog 是 ASP.NET Core 的一个插件,可以简化日志记录

    [翻译] ASP.NET Core 利用 Docker.ElasticSearch.Kibana 来记录日志 原文: Logging with ElasticSearch, Kibana, ASP.N ...

  5. Linux pwn入门教程(10)——针对函数重定位流程的几种攻击

    作者:Tangerine@SAINTSEC 本系列的最后一篇 感谢各位看客的支持 感谢原作者的付出一直以来都有读者向笔者咨询教程系列问题,奈何该系列并非笔者所写[笔者仅为代发]且笔者功底薄弱,故无法解 ...

  6. Veins(车载通信仿真框架)入门教程(四)——调试及记录结果

    Veins(车载通信仿真框架)入门教程(四)——调试及记录结果 在Veins入门教程(三)最后的动图中(如下图)可以看到大大小小的光圈,这个怎么实现的呢? 很简单,以收到RTS消息为例,通过finHo ...

  7. ABP入门教程10 - 展示层实现增删改查-控制器

    点这里进入ABP入门教程目录 创建控制器 在展示层(即JD.CRS.Web.Mvc)的Controllers下新建一个控制器CourseController.cs using Abp.Applicat ...

  8. asp.net Web项目中使用Log4Net进行错误日志记录

      使用log4net可以很方便地为应用添加日志功能.应用Log4net,开发者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能.同时,通过外部配置文件,用户可以不用重新编译程序就能 ...

  9. 基于 abp vNext 和 .NET Core 开发博客项目 - 异常处理和日志记录

    在开始之前,我们实现一个之前的遗留问题,这个问题是有人在GitHub Issues(https://github.com/Meowv/Blog/issues/8)上提出来的,就是当我们对Swagger ...

随机推荐

  1. [Swift]LeetCode461. 汉明距离 | Hamming Distance

    The Hamming distance between two integers is the number of positions at which the corresponding bits ...

  2. [Swift]LeetCode856. 括号的分数 | Score of Parentheses

    Given a balanced parentheses string S, compute the score of the string based on the following rule: ...

  3. [Swift]LeetCode858. 镜面反射 | Mirror Reflection

    There is a special square room with mirrors on each of the four walls.  Except for the southwest cor ...

  4. knockoutjs 上自己实现的flux

    在knockoutjs 上实现 Flux 单向数据流 状态机,主要解决多个组件之间对数据的耦合问题. 一.其实简单 flux的设计理念和实现方案,很大程度上人借鉴和参考了Vuex的实现,只是简化了某些 ...

  5. ESXI开启snmp协议方法

    公司用VMware做虚拟化,15+HPE 服务器做集群,现需要用zabbix监控其状态,于是想通过打开主机的snmp协议来采集数据,监控其状态,注意其数据是ESXI系统返回的. ssh登录到ESXI上 ...

  6. AspNetCore Mvc 使用 PartialView

    控制器: public IActionResult queryMongoDb(string dbname) { List<MongoDbModel> mdList = new List&l ...

  7. 从锅炉工到AI专家(2)

    大数据 上一节说到,大多的AI问题,会有很多个变量,这里深入的解释一下这个问题. 比如说某个网站要做用户行为分析,从而指导网站建设的改进.通常而言如果没有行为分析,并不需要采集用户太多的数据. 比如用 ...

  8. Windows证书操作

    查看证书 在快捷命令栏输入mmc打开控制台 选择文件-->添加或删除管理单元 添加,选择计算机账户,本地计算机 添加完成证书后可以将localhost证书删除 生成localhost证书 打开v ...

  9. SmartSql = Dapper + MyBatis + Cache(Memory | Redis) + ZooKeeper + R/W Splitting + ......

    SmartSql Why 拥抱 跨平台 DotNet Core,是时候了. 高性能.高生产力,超轻量级的ORM.156kb (Dapper:168kb) So SmartSql TargetFrame ...

  10. 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(4)- 联合调试(vspd, sscom, PyCharm2018.2)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之联合调试. 软件开发离不开调试,调试手段分两种:一是黑盒调试,即直接从输入/输出角度测试软件功能是 ...