微信号:iDotNet

介绍:专注分享 .NET 相关技术文章、教程和工具.有时也会涉及到IT职场相关的一些东西,或者来点幽默趣文.

ASP.NET Core 日志记录(NLog)

2019-04-11 11:45 DotNet

(给DotNet加星标,提升.Net技能


转自:ken-io

cnblogs.com/ken-io/p/aspnet-core


一、前言


1、本教程主要内容


  • ASP.NET Core + 内置日志组件记录控制台日志


  • ASP.NET Core + NLog 按天记录本地日志


  • ASP.NET Core + NLog 将日志按自定义LoggerName分类记录到不同目录


  • ASP.NET Core + NLog 按文件大小归档记录本地日志


  • NLog配置文件常用配置项说明


2、本教程环境信息



本篇代码以下代码进行调整: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();
});



这里设置项,主要是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.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常用配置项说明





2、附录示例代码


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


推荐阅读

(点击标题可跳转阅读)

.NET Core使用NLog通过Kafka实现日志收集

.NET Core平台日志记录框架NLog+Mysql

ASP.NET Core 2.1内置日志、使用Nlog将日志输出到文件


看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

喜欢就点一下「在看」呗~

 
DotNet 更多文章 C#并发编程之异步编程(线程讨论) Visual Studio 2019使用Live Share ASP.NET Core 使用Jaeger实现分布式追踪 .NET Core 3.0 助力 WPF 开发 实际体验Span<T> 的惊人表现
猜您喜欢 如何制作可复用iOS\/Material Design元件库?(附源文件) Linux Shell脚本编程初体验 6个原因说服你选择PostgreSQL 9.6 [精校版]Using Swift with Cocoa and Objective-C--互用性-与C API交互 移动4G到底有多快?