.net core日志NLog的使用
Nlog日志使用
视频:https://www.bilibili.com/video/BV1bv4y1a79X
参照:https://www.cnblogs.com/sheng-jie/p/17169929.html
PPT文件:https://files.cnblogs.com/files/summerZoo/NLog.pptx?t=1693272385&download=true
基础介绍
NLog 是一个跨平台的 .Net 日志组件。
NLog 遵从 BSD license,即允许商业应用且完全开放源代码。NLog日志支持高度自定义模板配置,且预置了大量的开箱即用的模板及字段(nlog-project.org),无需修改代码即可快速配置期望的日志结构,相对于Serilog有更高的灵活性。
日志等级
- Trace - 最常见的记录信息,一般用于普通输出
- Debug - 同样是记录信息,不过出现的频率要比Trace少一些,一般用来调试程序
- Info - 信息类型的消息
- Warn - 警告信息,一般用于比较重要的场合
- Error - 错误信息
- Fatal - 致命异常信息。一般来讲,发生致命异常之后程序将无法继续执行。
优先级:Trace <Debug<Info <Warn<Error<Fatal
重要概念
Targets——定义日志目标/输出
Rules—定义日志路由规则
配置
配置相关概念
Targets——定义日志目标/输出
Rules—定义日志路由规则
NLog 单独的配置文件是一个以 nlog 为根节点的 XML 文件。Targets、Rules在所有 NLog 配置文件中都必须存在,
extensions、includes、variables这些元素是可选的。
Targets
定义了一系列日志输出目标,每一个输出目标是一个 target 元素。对于每一个 target 元素,name 属性和 type 属性是必须要指定的:
name-target的名字。路由规则根据该属性将日志信息路由到当前目标。type-target的类型。当使用了 xsi 命名空间时,该属性被命名为 xsi:type。目前 NLog 支持的输出目标列表:Targets
不同类型的 target 节点可以接受不同的属性。例如对于 File 目标,fileName 参数指定了日志文件的文件名;对于 Console 目标,error 参数指定日志信息是写到标准错误流还是标准输出流。NLog 内置了许多预定义类型,详见如何自定义输出目标。
示例:
<targets>
<target name="f1" xsi:type="File" fileName="file1.txt"/>
<target name="f2" xsi:type="File" fileName="file2.txt"/>
<target name="n1" xsi:type="Network" address="tcp://localhost:4001"/>
<target name="ds" xsi:type="OutputDebugString"/>
</targets>
Rules
定义日志路由规则的集合,由一个或多个 logger 元素组成。每个 logger 元素记录了 logger 的名字、目标输出以及要处理的日志等级。NLog 从路由规则表的第一个 logger 开始处理,如果当前 logger 有效,则日志信息将被输出到指定的 target。如果某个 logger 被标记为 final ,那么其后的 logger 都会被忽略。
logger 包含下列属性:
name- logger的名字(可以使用通配符*)minLevel- 最小日志等级maxLevel- 最大日志等级level- 单一的日志等级levels- 以逗号分割的日志等级列表writeTo- 以逗号分割的输出目标列表final- 标记当前规则为最后一条规则,此后申明的rule不再生效enabled- 使能当前规则
如果在一条规则中定义了多个日志等级相关的属性(level, levels, minLevel 和 maxLevel),按照优先级只生效当前优先级最高的属性。等级相关属性优先级如下,
levellevelsminLevel和maxLevel- 没有设置(所有等级的日志都会被记录)
以下是 rules 节点的 例子 :
<rules>
<logger name="Name.Space.Class1" minlevel="Debug" writeTo="f1" />
<logger name="Name.Space.Class1" levels="Debug,Error" writeTo="f1" />
<logger name="Name.Space.*" writeTo="f3,f4" />
<logger name="Name.Space.*" minlevel="Debug" maxlevel="Error" final="true" />
</rules>
- 命名空间
Name.Space下类Class1中高于Debug级别的日志信息将被写入输出目标f1 - 命名空间
Name.Space下类Class1中级别为Debug和Error的日志信息将被写入target:f1 - 命名空间
Name.Space下所有类中的日志信息将被写入target:f3, f4 - 命名空间
Name.Space下所有类中级别在Debug和Error之间 (Debug,Info,Warn和Error) 的日志信息不被记录(因为没有指定属性writeTo)。由于标记了属性final,之后的logger都会被忽略。
配置方式
NLog 支持两种文件格式:
- 在标准的 *.exe.config 或 web.config/appsettings.json 中嵌入配置
- 在单独的文件中进行配置,单独配置文件便于在项目中切换配置或日志库
NLog 单独的文件配置文件是一个以 nlog 为根节点的 XML 文件
单独文件配置
添加NLog.Web.AspNetCore的引用
创建一个 nlog.config 文件。
autoReload——是否在配置文件被修改时自动重新加载的属性
internalLogLevel—用于指定NLog内部日志记录的详细程度
internalLogFile—指定NLog内部日志记录的输出位置
extensions ——有些类似${shortdate}、layout表达式需要引入对应的包才能生效
<?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"
internalLogLevel="Info"
internalLogFile="c:\temp\internal-nlog-AspNetCore.txt"> <!-- enable asp.net core layout renderers -->
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions> <!-- the targets to write to -->
<targets>
<!-- File Target for all log messages with basic details -->
<target xsi:type="File" name="allfile" fileName="c:\temp\nlog-AspNetCore-all-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}" /> <!-- File Target for own log messages with extra web details using some ASP.NET core renderers -->
<target xsi:type="File" name="ownFile-web" fileName="c:\temp\nlog-AspNetCore-own-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|${callsite}" /> <!--Console Target for hosting lifetime messages to improve Docker / Visual Studio startup detection -->
<target xsi:type="Console" name="lifetimeConsole" layout="${MicrosoftConsoleLayout}" />
</targets> <!-- rules to map from logger name to target -->
<rules>
<!--All logs, including from Microsoft-->
<logger name="*" minlevel="Trace" writeTo="allfile" /> <!--Output hosting lifetime messages to console target for faster startup detection -->
<logger name="Microsoft.Hosting.Lifetime" minlevel="Info" writeTo="lifetimeConsole, ownFile-web" final="true" /> <!--Skip non-critical Microsoft logs and so log only own logs (BlackHole) -->
<logger name="Microsoft.*" maxlevel="Info" final="true" />
<logger name="System.Net.Http.*" maxlevel="Info" final="true" /> <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
</rules>
</nlog>
做对应的依赖注入
var builder = WebApplication.CreateBuilder(args); // Add services to the container.
builder.Services.AddControllersWithViews(); // NLog: Setup NLog for Dependency injection
builder.Logging.ClearProviders();
builder.Host.UseNLog(); var app = builder.Build();
//其他注入
.net core 3.1见Getting started with ASP.NET Core 3 · NLog/NLog Wiki (github.com)
在appsettings.json里配置
添加NLog.Web.AspNetCore的引用
在appsettings.json里配置,也是要配置对应的targets、rules等属性
//Nlog配置
"NLog": {
"throwConfigExceptions": true,
"extensions": [
{
"assembly": "NLog.Web.AspNetCore"
}
],
"targets": {
"async": true,
"logfile": {
"type": "File",
"fileName": "Log/nlog-${shortdate}.log",
"layout": {
"type": "JsonLayout",
"attributes": [
{
"name": "@timestamp",
"layout": "${date}"
},
{
"name": "app",
"layout": "${processname}"
},
{
"name": "env",
"layout": "${environment:ASPNETCORE_ENVIRONMENT}"
},
{
"name": "level",
"layout": "${level}"
},
{
"name": "logger",
"layout": "${logger}"
},
{
"name": "message",
"layout": "${message}"
},
{
"name": "exception",
"layout": "${exception:format=toString}"
},
{
"name": "aspnet-request-method",
"layout": "${aspnet-request-method}"
},
{
"name": "aspnet-request-url",
"layout": "${aspnet-request-url}"
},
{
"name": "aspnet-mvc-controller",
"layout": "${aspnet-mvc-controller}"
},
{
"name": "aspnet-mvc-action",
"layout": "${aspnet-mvc-action}"
}
]
}
},
"logconsole": {
"type": "Console"
}
},
"rules": [
{
"logger": "*",
"minLevel": "Info",
"writeTo": "logconsole"
},
{
"logger": "*",
"minLevel": "Debug",
"writeTo": "logfile"
}
]
},
注入
var builder = WebApplication.CreateBuilder(args);
builder.Configuration
.SetBasePath(builder.Environment.ContentRootPath)
.AddJsonFile("appsettings.json", true, true)
.AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json", true, true)
.AddEnvironmentVariables();
//从appsetting里读取NLog的配置作为配置
NLog.LogManager.Configuration = new NLogLoggingConfiguration(builder.Configuration.GetSection("NLog")); // NLog: Setup NLog for Dependency injection
builder.Logging.ClearProviders();//清除当前定义的所有日志提供程序
//.net core 5+版本,默认情况下,NLog会对ILoggerFactory添加一个过滤器,该过滤器会过滤掉一些不需要记录日志的消息,从而提高日志记录效率。但是,在某些情况下,我们可能需要记录这些被过滤掉的消息,因此可以将RemoveLoggerFactoryFilter属性设置为false,以禁用NLog的默认过滤器,达到兼容ILogger的目的
builder.Host.UseNLog(new NLogAspNetCoreOptions() { RemoveLoggerFactoryFilter = false });var builder = WebApplication.CreateBuilder(args);
NLog.LogManager.Configuration = new NLogLoggingConfiguration(builder.Configuration.GetSection("NLog"));//从appsetings的NLog配置中读取配置 // NLog: Setup NLog for Dependency injection
builder.Logging.ClearProviders();//清除当前定义的所有日志提供程序
//.net core 5+版本,默认情况下,NLog会对ILoggerFactory添加一个过滤器,该过滤器会过滤掉一些不需要记录日志的消息,从而提高日志记录效率。但是,在某些情况下,我们可能需要记录这些被过滤掉的消息,因此可以将RemoveLoggerFactoryFilter属性设置为false,以禁用NLog的默认过滤器,达到兼容ILogger的目的
builder.Host.UseNLog(new NLogAspNetCoreOptions() { RemoveLoggerFactoryFilter = false });
//其他版本builder.Host.UseNLog()
输出方式配置
NLog 支持多种输出方式,常用的有控制台、文件和数据库输出,
控制台输出:
<targets>
<target name="console" xsi:type="ColoredConsole" layout="${longdate} ${level:uppercase=true} ${message}" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="console" />
</rules>
文件输出:
<targets>
<target name="file" xsi:type="File" fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${level:uppercase=true} ${message}" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="file" />
数据库输出
<targets>
<target name="database" xsi:type="Database" connectionString="Data Source=myserver;Initial Catalog=mydatabase;Integrated Security=True;"
commandText="INSERT INTO Log (Date, Level, Message) VALUES (@Date, @Level, @Message)">
<parameter name="@Date" layout="${longdate}" />
<parameter name="@Level" layout="${level:uppercase=true}" />
<parameter name="@Message" layout="${message}" />
</target>
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="database" />
</rules>
Layout
NLog最强大的资产之一是Layout是一种用于定义日志消息格式的机制。它允许你在日志消息中包含文本、变量和属性,并将它们合并为一个格式化的字符串。${``}
支持多种格式输出,通过type来配置
json—JsonLayout
xml—XmlLayout

还有大量常用化的标签来配置消息格式
${message}:日志消息的文本${longdate}:日期和时间(格式为 yyyy-MM-dd HH:mm:ss)${level}:日志级别(例如,Info、Warn、Error)。${exception}:异常信息。${aspnet-request-url}:记录 HTTP 请求 URL${aspnet-user-identity}:记录 ASP.NET 用户身份${aspnet-request-method}:记录 HTTP 请求方法(例如,GET、POST)。${aspnet-request-controller}:记录 ASP.NET MVC 框架中控制器的名称。
轮转日志
NLog 支持日志轮转(也称为日志滚动),即在日志文件大小或日期达到指定条件时,将当前日志文件重命名为备份文件,并创建一个新的日志文件,以继续记录日志。
按文件大小轮转:
<target name="file" xsi:type="File" fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${level:uppercase=true} ${message}"
archiveAboveSize="1024"
archiveFileName="${basedir}/logs/archives/${shortdate}.{#}.log"
archiveNumbering="Sequence"
maxArchiveFiles="10" />
archiveAboveSize="1024":当日志文件大小超过 1024 字节时,触发轮转操作。archiveFileName="${basedir}/logs/archives/${shortdate}.{#}.log":指定备份文件的名称模板,在此模板中,{#}表示备份文件的序号。archiveNumbering="Sequence":指定备份文件的命名方式为序列号方式。maxArchiveFiles="10":指定最多保留 10 个备份文件。
按日期轮转
<target name="file" xsi:type="File" fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${level:uppercase=true} ${message}"
archiveEvery="Day"
archiveFileName="${basedir}/logs/archives/{#}.log"
archiveNumbering="Date"
maxArchiveDays="7" />
archiveEvery="Day":指定按天轮转日志文件。archiveFileName="${basedir}/logs/archives/{#}.log":指定备份文件的名称模板,在此模板中,{#}表示备份文件的日期。archiveNumbering="Date":指定备份文件的命名方式为日期方式。maxArchiveDays="7":指定最多保留 7 天的备份文件
.net core日志NLog的使用的更多相关文章
- ASP.NET Core 入门教程 10、ASP.NET Core 日志记录(NLog)入门
一.前言 1.本教程主要内容 ASP.NET Core + 内置日志组件记录控制台日志 ASP.NET Core + NLog 按天记录本地日志 ASP.NET Core + NLog 将日志按自定义 ...
- net core体系-web应用程序-4net core2.0大白话带你入门-7asp.net core日志组件(Logger和Nlog)
asp.net core日志组件 日志介绍 Logging的使用 1. appsettings.json中Logging的介绍 Logging的配置信息是保存在appsettings.json配置 ...
- asp.net core结合NLog搭建ELK实时日志分析平台
0.整体架构 整体架构目录:ASP.NET Core分布式项目实战-目录 一.介绍ELK 1.说明(此篇ELK采用rpm的方式安装在服务器上)-牛刀小试 承接上一篇文章的内容准备部署ELK来展示asp ...
- .NET Core使用NLog通过Kafka实现日志收集
微服务日志之.NET Core使用NLog通过Kafka实现日志收集 https://www.cnblogs.com/maxzhang1985/p/9522017.html 一.前言 NET Core ...
- .NET 黑魔法 - asp.net core 日志系统
asp.net core 里如何记录日志呢? 这要从asp.net core的依赖注入说起,在asp.net core里的依赖注入真是无所不在,各种面向切面的接口与事件. 好吧,来点干货. 首先,我们 ...
- 自定义ASP.NET Core日志中间件
这个日志框架使用的是ASP.NET Core的NLog,用来记录每次请求信息和返回信息. 1.首先创建一个Web应用项目,我选择的是MVC模板: 2.使用NuGet添加Microsoft.Extens ...
- ELK分布式日志+NLog在.NetCore中的应用
一.ELK简介 ELK是Elasticsearch.Logstash和Kibana首字母的缩写.这三者均是开源软件,这三套开源工具组合起来形成了一套强大的集中式日志管理平台 Elasticsearch ...
- .NET Core 日志记录程序和常用日志记录框架
本文主要内容为.NET Core的日志记录程序和常使用的日志记录框架的简单使用 首先,打开VS2019新建一个ASP.NET Core Web Api项目,项目创建好后会有一个集成好的天气预报的类和控 ...
- ASP.NET Core使用NLog记录日志到Microsoft Sql Server
在之前的文章中介绍了如何在ASP.NET Core使用NLog,本文为您介绍在ASP.NET Core使用NLog记录到Microsoft Sql Server 1.我们需要添加依赖: NLog.We ...
- .net core日志记录
.net core日志记录 日志是必须的,目前采用log4net进行日志记录. 定义通用的日志记录方法 public static class Log4NetFunc { private static ...
随机推荐
- Numa初识
本文分享自天翼云开发者社区<Numa初识>,作者:j****n Numa产生 在二十世纪九十年代被开发出来的. 首次商业化实现基于NUMA的Unix系统的是对称多处理XPS-100系列服务 ...
- 最新demo版 | 如何0-1开发支付宝小程序之小程序页面功能介绍(三)
前两期讲了小程序开发的准备工作以及前期需要如何调试,今天我们就来介绍下开发一个支付宝小程序页面需要了解哪些信息. 一个小程序页面的整体功能的构成离不开页面展示(AXML).页面样式(ACSS)以及页面 ...
- 记录一次WPF程序进程挂起问题
## 1. 使用背景 开发`WPF`单进程项目,在项目中使用`MongoDB`数据库,需要连接多个不同的数据库实例,另外项目框架采用了事件聚合器来管理模块间的通知调用,基于`NetMQ`实现了一个`Z ...
- 工业机器人维修保养|ABB机器人IRB 6700维修保养技巧
通过机器人维修保养服务定制合理的维修保养工作,可以确保ABB机器人IRB 6700的持续稳定运行,延长其使用寿命,为企业的生产提供有力保障. 一.ABB机器人IRB 6700日常检查与维护 外观检查: ...
- 在Linux系统下启动eclipse时遇到Eclipse 无法正常启动
Eclipse: 无法打开显示: 出现此问题原因: 这通常表示 Eclipse 试图在没有合适显示环境的情况下启动,可能是在没有图形界面的环境(例如远程服务器或没有正确配置的 X11 转发)中运行. ...
- Linux 安装 MySQL 8.0
目录 下载 安装数据库 修改mysql配置文件(若没有则新建) 安装并初始化mysql 查看mysql密码 配置启动 登录MySQL 修改密码 配置远程连接 配置防火墙 常见错误 Windows 安装 ...
- gorm中使用乐观锁
乐观锁简介 乐观锁(又称乐观并发控制)是一种常见的数据库并发控制策略. 乐观并发控制多数用于数据竞争(data race)不大.冲突较少的环境中,这种环境中,偶尔回滚事务的成本会低于读取数据时锁定数据 ...
- hotmail 获取邮箱授权码
第一步:登录microsoft账户,进入到安全性页面. https://account.microsoft.com/?lang=zh-CN&refd=account.live.com& ...
- 编写你的第一个 Django 应用程序,第5部分
本教程从教程 4 停止的地方开始.我们已经构建了一个网络投票应用程序,现在我们将为其创建一些自动化测试. 一.自动化测试简介 1.什么是自动化测试? 测试是检查代码操作的例程. 测试在不同级别运行.一 ...
- 原生JS实现虚拟列表(不使用Vue,React等前端框架)
好家伙, 1. 什么是虚拟列表 虚拟列表(Virtual List)是一种优化长列表渲染性能的技术.当我们需要展示成千上万条数据时,如果一次性将所有数据渲染到DOM中,会导致页面卡顿甚至崩溃.虚拟 ...