内容简介:本篇代码以下代码进行调整: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)入门》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Iterative Methods for Sparse Linear Systems, Second Edition
Yousef Saad / Society for Industrial and Applied Mathematics / 2003-04-30 / USD 102.00
Tremendous progress has been made in the scientific and engineering disciplines regarding the use of iterative methods for linear systems. The size and complexity of linear and nonlinear systems arisi......一起来看看 《Iterative Methods for Sparse Linear Systems, Second Edition》 这本书的介绍吧!