.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
),按照优先级只生效当前优先级最高的属性。等级相关属性优先级如下,
level
levels
minLevel
和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 ...
随机推荐
- .NET Core GC模式(gc mode)底层原理浅谈
简介 CLR的GC模式与JVM的GC模式理念不同,相对JVM的各种小参显得比较简陋,CLR的理念是约定优于配置,并根据程序类型来分提供了几个默认的选项给大家选择. CS程序默认使用的工作站模式(Wor ...
- RAW镜像格式介绍
本文分享自天翼云开发者社区<RAW镜像格式介绍>,作者:z****n RAW(Raw Disk Image)是一种简单而基本的虚拟化镜像格式,用于存储虚拟机的磁盘内容.它是一种原始的二进制 ...
- Hetao P1184 宝可梦训练家 [ 绿 ][ 背包dp ][ 线性dp ]
原题 题解 一道超级牛逼的背包变形,想通之后真的很简单,难点在于想到使用 dp 并且用 dp 的值判断是否合法. 首先观察本题的数据范围:\(1\le n,q \le 10^5\) ,可知本题的询问要 ...
- DotNet跨平台 - docker+nginx+ssl 负载均衡
环境:CentOS7 服务器需要安装:docker.nginx.OpenSSL 一.部署方案 在linux服务器上,我们的Web站点程序采用docker容器部署,为了演示负载均衡,我们在同一台linu ...
- C# TorchSharp 图像分类实战:VGG大规模图像识别的超深度卷积网络
目录 图像分类 | VGG大规模图像识别的超深度卷积网络 数据集 直接下载 opendatalab 数据集社区 自定义数据集 模型训练 教程名称:使用 C# 入门深度学习 作者:痴者工良 教程地址: ...
- TensorFlow函数 tf.argmax()
参数: input:输入数据 dimension:按某维度查找. dimension=0:按列查找: dimension=1:按行查找: 返回: 最大值的下标 import tensorflow.co ...
- Vue 页面批量导入其他组件
<template> <div> <template v-for="(item) in names"> <component :is=&q ...
- Flink - [05] 时间语义 & Watermark
题记部分 一.时间语义 Flink中的时间语义分为以下, (1)Event Time:事件创建的时间 (2)Ingestion Time:数据进入Flink的时间 (3)Processing Time ...
- Elasticsearch搜索引擎学习笔记(四)
分词器 内置分词器 standard:默认分词,单词会被拆分,大小会转换为小写. simple:按照非字母分词.大写转为小写. whitespace:按照空格分词.忽略大小写. stop:去除无意义单 ...
- 当我老丈人都安装上DeepSeek的时候,我就知道AI元年真的来了!
关注公众号回复1 获取一线.总监.高管<管理秘籍> 春节期间DeepSeek引爆了朋友圈,甚至连我老丈人都安装了APP,这与两年前OpenAI横空出世很不一样,DeepSeek似乎真的实现 ...