一、前言

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]LeetCode54. 螺旋矩阵 | Spiral Matrix

    Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...

  2. [Swift]LeetCode532. 数组中的K-diff数对 | K-diff Pairs in an Array

    Given an array of integers and an integer k, you need to find the number of unique k-diff pairs in t ...

  3. [Swift]LeetCode701. 二叉搜索树中的插入操作 | Insert into a Binary Search Tree

    Given the root node of a binary search tree (BST) and a value to be inserted into the tree, insert t ...

  4. [Swift]LeetCode717. 1比特与2比特字符 | 1-bit and 2-bit Characters

    We have two special characters. The first character can be represented by one bit 0. The second char ...

  5. [Swift]LeetCode910. 最小差值 II | Smallest Range II

    Given an array A of integers, for each integer A[i] we need to choose either x = -K or x = K, and ad ...

  6. 好用的函数,assert,random.sample,seaborn tsplot, tensorflow.python.platform flags 等,持续更新

    python 中好用的函数,random.sample等,持续更新 random.sample random.sample的函数原型为:random.sample(sequence, k),从指定序列 ...

  7. 上次被人说TK不好咯,这次给你整个高大上的

    0.环境 操作系统:Windows Python版本:3.6.0 1.前言 PyQt是一个创建GUI应用程序的工具包.它是Python编程语言和Qt库的成功融合.Qt库是目前最强大的库之一. 2.效果 ...

  8. HBase篇--HBase操作Api和Java操作Hbase相关Api

    一.前述. Hbase shell启动命令窗口,然后再Hbase shell中对应的api命令如下. 二.说明 Hbase shell中删除键是空格+Ctrl键. 三.代码 1.封装所有的API pa ...

  9. 我要曝光!CDN 省钱大法!

    七夕节刚过去,小明却特别郁闷,因为七夕当天,他错过了和远在北京的女神表白的机会.事情的经过是怎样的呢?为了在七夕当天送给自己女神一件礼物,小明在某购物网站上花重金购买了特别的礼物,礼物是从广东发送,结 ...

  10. HashTable与ConcurrentHashMap的区别