Net6 控制台程序引入Nlog 、Nlog配置文件解读
十年河东,十年河西,莫欺少年穷
学无止境,精益求精
nlog是继log4Net后C#编程界又一颗闪亮的星,俗称super star
1、先学会使用
1.1、新建控制台应用程序,引入如下nuget
1、Microsoft.Extensions.Logging 2、Microsoft.Extensions.Logging.Console 3、NLog.Extensions.Logging
1.2、引入nlog配置文件
首先项目中新建nlog.config文件,并将nlog.config文件属性设置为如果始终复制
nlog的配置文件在nlog的官网上可以下载,我们先打开nuget的官网:https://www.nuget.org/ , 搜索nlog组件
找到nlog官网链接
在打开的网址:https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-5 中找到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" internalLogLevel="Info" internalLogFile="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="logs/log-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}" archiveAboveSize="10000" maxArchiveFiles="3"/> <!-- File Target for own log messages with extra web details using some ASP.NET core renderers --> <target xsi:type="File" name="ownFile-web" fileName="nlog-AspNetCore-own-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|${callsite}" archiveAboveSize="10000" maxArchiveFiles="3" /> <!--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>
控制台程序如下:
using System; using System.IO; using System.Linq; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using NLog.Extensions.Logging; namespace ConsoleApp1 { internal class Program { //NLog.Extensions.Logging //nuget.org //project website //找到config 新建nlog.config[名称全小写] 设置如果比较新则负复制 更改文本日志存放路径到当前程序目录 static void Main(string[] args) { ServiceCollection services = new ServiceCollection(); services.AddLogging(log => { log.AddConsole(); log.AddNLog(); log.SetMinimumLevel(LogLevel.Information); }); services.AddScoped<LogService>(); using (ServiceProvider sp = services.BuildServiceProvider()) { var logservice = sp.GetService<LogService>(); logservice.test(); } Console.Read(); } public class LogService { private readonly ILogger<LogService> logger; public LogService(ILogger<LogService> logger) { this.logger = logger; } public void test() { for(int i = 0; i < 100000; i++) { logger.LogTrace("跟踪"); logger.LogDebug("调试"); logger.LogInformation("信息"); logger.LogError("错误"); logger.LogCritical("严重错误"); try { int a = 0; int b = 1; var c = b / a; } catch (Exception ex) { logger.LogError(ex, "异常"); } } } /// <summary> /// windows 日志 部署在linux 下无效 /// </summary> public void EventLog() { //Microsoft.Extensions.Logging.EventLog } } } }
运行此项目,可以在bin/debug/logs文件夹下看到生成的日志文件
2、nlog配置文件解读
NLog 配置文件是一个以 nlog
为根节点的 XML 文件。nlog
节点可以添加命名空间,以开启 Visual Studio 的 Intellisense 功能。
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> </nlog>
以下元素可以作为 nlog
节点的子节点,前两种元素在所有 NLog 配置文件中都必须存在,剩余元素是可选的。
targets
- 定义日志目标/输出rules
- 定义日志路由规则extensions
- 定义要加载的 NLog 扩展项 *.dll 文件includes
- 定义要包含的外部配置文件variables
- 设置配置变量的值
在 nlog
节点中设置属性autoReload="true"
,NLog 会监视配置文件,并在配置文件发生更改时自动重新载入配置文件而不需要重启应用程序。该功能支持通过 include
包含的子配置文件。示例如下,
<nlog autoReload="true"> ... </nlog>
Targets
targets
节点中定义了一系列日志输出目标,每一个输出目标是一个 target
元素。对于每一个 target
元素,name
属性和 type
属性是必须要指定的:
name
-target
的名字。路由规则根据该属性将日志信息路由到当前目标。type
-target
的类型。当使用了 xsi 命名空间时,该属性被命名为 xsi:type。目前 NLog 支持的输出目标列表:Targets
不同类型的 target
节点可以接受不同的属性。例如对于 File
目标,fileName
参数指定了日志文件的文件名;对于 Console
目标,error
参数指定日志信息是写到标准错误流还是标准输出流。NLog 内置了许多预定义类型,也可以自定义输出目标类型,详见如何自定义输出目标。
以下是 targets
节点的例子:
<targets> <target name="f1" xsi:type="File" fileName="file1${shortdate}.txt" archiveAboveSize="10000" maxArchiveFiles="3" /> <target name="f2" xsi:type="File" fileName="file2${shortdate}.txt" archiveAboveSize="10000" maxArchiveFiles="3" /> <target name="n1" xsi:type="Network" address="tcp://localhost:4001"/> <target name="ds" xsi:type="OutputDebugString"/> </targets>
archiveAboveSize 代表日志文本文件的最大字节数,当前设定的为 10KB
maxArchiveFiles 代表存储的日志文件最大个数,设置后可以避免日志文件无限量增加,导致磁盘空间不够
Rules
rules
节点是日志路由规则的集合,由一个或多个 logger
元素组成。每个 logger
元素记录了 logger 的名字、目标输出以及要处理的日志等级。NLog 从路由规则表的第一个 logger
开始处理,如果当前 logger
有效,则日志信息将被输出到指定的 target
。如果某个 logger
被标记为 final
,那么其后的 logger
都会被忽略。
logger
包含下列属性:
name
- logger的名字(可以使用通配符*)minLevel
- 最小日志等级maxLevel
- 最大日志等级level
- 单一的日志等级levels
- 以逗号分割的日志等级列表writeTo
- 以逗号分割的输出目标列表final
- 标记当前规则为最后一条规则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>
final="true" 是指一旦匹配到该规则,则不继续往下匹配,相当于for循环中的break
name ="*" 是指所有日志都会被匹配, name 中可以指定固定的命名空间,也可以指定具有模糊匹配的命名空间
命名空间 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
都会被忽略。
Extensions
extensions
节点可以添加额外的NLog元包或自定义功能,语法为 。assembly
属性指定的被包含程序集,配置时不用带后缀 .dll
。示例如下,
<nlog> <extensions> <add assembly="MyAssembly" /> </extensions> <targets> <target name="a1" type="MyFirst" host="localhost" /> </targets> <rules> <logger name="*" minLevel="Info" appendTo="a1" /> </rules> </nlog>
NLog 4.0 之后,与 NLog.dll
同目录下名如 NLog*.dll
的程序集(如 NLog.CustomTarget.dll
)会被自动加载。
Includes
include
节点指定当前配置文件包含多个子配置文件,语法为 。通过 ${}
语法可以使用环境变量,下例展示包含一个名为当前机器名的配置文件。
<nlog> ... <include file="${machinename}.config" /> ... </nlog>
Variables
variable
元素定义了配置文件中需要用到的变量,一般用来表示复杂或者重复的表达式(例如文件名)。变量需要先定义后使用,否则配置文件将初始化失败。定义变量的语法如下:
<variable name="var" value="xxx" />
定义变量之后,可以通过 ${var}
语法来使用:
<nlog> <variable name="logDirectory" value="logs/${shortdate}" /> <targets> <target name="file1" xsi:type="File" fileName="${logDirectory}/file1.txt" /> <target name="file2" xsi:type="File" fileName="${logDirectory}/file2.txt" /> </targets> </nlog>
NLog 支持的日志级别
Trace
- very detailed logs,包含大量的信息,例如 protocol payloads。该级别一般仅在开发环境中启用。Debug
- debugging information, 比Trance
级别稍微粗略,一般在生产环境中不启用。Info
- information messages,一般在生产环境中启用。Warn
- warning messages,一般用于可恢复或临时性错误的非关键问题。Error
- error messages,一般是异常信息。Fatal
- 非常严重的错误!
参考:https://www.cnblogs.com/Can-daydayup/p/11182958.html
https://zhuanlan.zhihu.com/p/35469359
@天才卧龙的波尔卡