内容简介:本篇代码以下代码进行调整:ASP.NET Core内置日志组件,可以将日志输出在控制台修改
一、前言
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...
二、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配置文件一般主要包含两个部分,<targets>节点配置日志写入目标,<rules>节点配置匹配路由到<targets>的规则。
主要配置项 | 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...
- 本文参考
https://docs.microsoft.com/zh...
https://github.com/NLog/NLog....
https://github.com/nlog/NLog/...
本文后首发于我的独立博客: https://ken.io/note/asp.net-c...
以上所述就是小编给大家介绍的《ASP.NET Core 入门教程 10、ASP.NET Core 日志记录(NLog)入门》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
营销三大算法
刘学林、刘逸春、张新春、王颖、余彬晶、刘锦炽、董少灵、沈逸超、王锐睿、孙静若 / 上海交通大学出版社 / 2018-1-31 / 88.00元
未来的营销应该是数字化的,即数字营销。以数据为本,用演算做根,数字营销能够演算生活的方方面面。在数字营销领域,市场的整个投入、产出带来什么东西?企业一定要狠清楚地知道,这是做数字营销的本质。数字营销和企业做生意的本质是一样的,目的都是以投入换取产出。 本书由正和岛数字营销部落编写,基于大量企业的案例与数据,提出了营销三大核心算法与一套全局营销系统,帮助企业CEO与营销人员科学化建立全局营销系......一起来看看 《营销三大算法》 这本书的介绍吧!