目录
NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码。
NLog是一个简单灵活的.NET日志记录类库。通过使用NLog,我们可以在任何一种.NET语言中输出带有上下文的(contextual information)调试诊断信息,根据喜好配置其表现样式之后发送到一个或多个输出目标(target)中。
NLog的API非常类似于log4net,且配置方式非常简单。NLog使用路由表(routing table)进行配置,但log4net却使用层次性的appender配置,这样就让NLog的配置文件非常容易阅读,并便于今后维护。
官网:NLog
文档地址:Home · NLog/NLog Wiki · GitHub
首先使用VS2022创建基于.Net6的WebApi项目MyNLog,然后项目中创建类库项目MyNLog.Utils
1)MyNLog.Utils项目,从nuget中引入NLog
2) MyNLog.Utils项目中创建类NLogService.cs,使用NLog最简单的方法写日志
- using NLog;
-
- namespace MyNLog.Utils
- {
- public class NLogService
- {
- ///
- /// 写日志
- ///
- ///
- public static void WriteLog(string content)
- {
- var config = new NLog.Config.LoggingConfiguration();// 创建一个配置文件对象
- //创建日志写入目的地
- var logfile = new NLog.Targets.FileTarget("logfile") { FileName = $"logs/{DateTime.Now.ToString("yyyy-MM-dd")}.txt" };
- //添加日志路由规则
- config.AddRule(LogLevel.Debug, LogLevel.Fatal, logfile);
- //配置文件生效
- LogManager.Configuration = config;
- //创建日志记录对象方式1
- Logger Logger = LogManager.GetCurrentClassLogger();
- //创建日志记录对象方式2,手动命名
- //Logger Logger2 = LogManager.GetLogger("MyLogger");
- //打出日志
- Logger.Info(content);
- }
- }
- }
3)项目 MyNLog中引用MyNLog.Utils项目,然后在WeatherForecastController中调用日志写入方法
- using Microsoft.AspNetCore.Mvc;
-
- namespace MyNLog.Controllers
- {
- [ApiController]
- [Route("[controller]")]
- public class WeatherForecastController : ControllerBase
- {
- private static readonly string[] Summaries = new[]
- {
- "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
- };
-
- //private readonly ILogger
_logger; -
- //public WeatherForecastController(ILogger
logger) - //{
- // _logger = logger;
- //}
-
- [HttpGet(Name = "GetWeatherForecast")]
- public IEnumerable
Get() - {
- MyNLog.Utils.NLogService.WriteLog("Hello NLog");//写日志
- return Enumerable.Range(1, 5).Select(index => new WeatherForecast
- {
- Date = DateTime.Now.AddDays(index),
- TemperatureC = Random.Shared.Next(-20, 55),
- Summary = Summaries[Random.Shared.Next(Summaries.Length)]
- })
- .ToArray();
- }
- }
- }
4)启动项目,Swagger中调用接口,会在bin/Debug/net6.0/logs中看见写入的日志
参见 Getting started with ASP.NET Core 6 · NLog/NLog Wiki · GitHub
1)修改NLogService中的代码
- using System;
- using System.Diagnostics;
- using System.IO;
- using System.Reflection;
- using System.Xml;
- using NLog.Config;
- using NLog;
-
- namespace MyNLog.Utils
- {
- public class NLogService
- {
- private static ILogger _logger;
- ///
- ///
- ///
- static NLogService()
- {
- //判断配置文件NLog.config是否存在
- bool flag = File.Exists(Path.Combine(Path.GetDirectoryName(typeof(NLogService).Assembly.Location), "NLog.config"));
- //获取配置信息
- LogManager.Configuration = GetXmlLoggingConfiguration(!flag);
- }
- ///
- ///
- ///
- private NLogService()
- {
- }
- ///
- /// logger 初始化
- ///
- private static void SetLogger()
- {
- StackFrame stackFrame = new StackFrame(2, false);
- MethodBase method = stackFrame.GetMethod();
- _logger = LogManager.GetLogger(string.Format("{0}.{1}", method.DeclaringType, method.Name));
- }
- ///
- /// 获取logger 配置信息
- ///
- ///
- ///
- public static XmlLoggingConfiguration GetXmlLoggingConfiguration(bool fromManifestResource = true)
- {
- XmlLoggingConfiguration result;
- if (fromManifestResource)
- {
- Type declaringType = MethodBase.GetCurrentMethod().DeclaringType;
- string text = ((declaringType != null) ? declaringType.Namespace : null) ?? "Logging.NLog";
- Assembly executingAssembly = Assembly.GetExecutingAssembly();
- Stream manifestResourceStream = executingAssembly.GetManifestResourceStream(text + ".nlog.config");
- XmlTextReader xmlTextReader = new XmlTextReader(manifestResourceStream);
- result = new XmlLoggingConfiguration(xmlTextReader);
- }
- else
- {
- string text2 = Path.Combine(Path.GetDirectoryName(typeof(NLogService).Assembly.Location), "nlog.config");
- bool flag = !File.Exists(text2);
- if (flag)
- {
- throw new FileNotFoundException("nlog.config文件未找到。");
- }
- result = new XmlLoggingConfiguration(new FileInfo(text2).FullName);
- }
- return result;
- }
- ///
- /// write info log
- ///
- ///
- public static void Info(string msg)
- {
- SetLogger();
- _logger.Info(msg);
- }
- ///
- /// write warn log
- ///
- ///
- public static void Warn(string msg)
- {
- SetLogger();
- _logger.Warn(msg);
- }
- ///
- /// write debug log
- ///
- ///
- public static void Debug(string msg)
- {
- SetLogger();
- _logger.Debug(msg);
- }
- ///
- /// write error log
- ///
- ///
- public static void Error(string msg)
- {
- SetLogger();
- _logger.Error(msg);
- }
- ///
- /// write exception log
- ///
- ///
- public static void Exception(Exception e)
- {
- SetLogger();
- _logger.Error
(e); - }
- }
- }
2)接口启动项目中,新增NLog.config配置文件
- "1.0" encoding="utf-8" ?>
- <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
- autoReload="true"
- internalLogLevel="Info"
- internalLogFile="nlog-internal.log">
-
-
-
-
- <variable name="logDir" value="${basedir}/nlogs/${date:format=yyyyMMdd}/${level}.log"/>
-
- <extensions>
- <add assembly="NLog.Web.AspNetCore" />
- extensions>
-
- <targets async="true">
-
-
-
-
- <target name="allfile" xsi:type="File"
- fileName="${basedir}/adminlogs/all.txt"
- archiveFileName="${basedir}/adminlogs/all.{###}.txt"
- archiveEvery="Day"
- archiveNumbering="DateAndSequence"
- archiveAboveSize="20000000"
- maxArchiveFiles="30"
- keepFileOpen="true"
- layout="${longdate} | ${event-properties:item=EventId_Id} | ${uppercase:${level}} | ${logger} | ${aspnet-request-iP:CheckForwardedForHeader=true} | ${event-properties:item=user} | ${aspnet-request-url} | ${message} | ${event-properties:item=requestParam} | ${event-properties:item=jsonResult} | ${onexception:${exception:format=tostring}"/>
-
-
- <target name="sqlfile" xsi:type="File"
- fileName="${basedir}/adminlogs/all-sql.txt"
- archiveFileName="${basedir}/adminlogs/all.sql{###}.txt"
- archiveEvery="Day"
- archiveNumbering="DateAndSequence"
- archiveAboveSize="20000000"
- maxArchiveFiles="30"
- keepFileOpen="false"
- layout="===========================================${newline} ${longdate} - ${aspnet-request-iP} - ${aspnet-request-headers:HeaderNames=userid} - ${aspnet-request-url} ${newline} ${message}"/>
-
-
- <target name="console" xsi:type="ColoredConsole" layout="${date:format=MM-dd HH\:mm\:ss} | ${uppercase:${level}} | ${logger} | ${aspnet-request-iP} | ${aspnet-request-url} | ${message}"/>
-
- <target name="consoleSql" xsi:type="ColoredConsole" layout="${date:format=MM-dd HH\:mm\:ss} | ${aspnet-request-url} ${newline} ${message}"/>
-
- <target name="blackhole" xsi:type="Null" />
- targets>
-
- <rules>
-
-
- <logger name="*" minlevel="Trace" writeTo="allfile" />
-
- <logger name="*" minLevel="Debug" writeTo="console"/>
-
- <logger name="Microsoft.*" writeTo="blackhole" final="true" />
-
- rules>
- nlog>
项目运行后的日志:
关于配置文件相关参数说明参见:https://github.com/NLog/NLog/wiki/Configuration-file
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
internalLogLevel="Info"
internalLogFile="nlog-internal.log">
参数名称 | 说明 | 参数值 |
autoReload | 修改配置文件后是否允许自动加载无须重启程序 | true/false |
throwExceptions | 内部日志系统抛出异常 | true/false |
internalLogLevel | 可选Trace|Debug|Info|Warn|Error|Fatal决定内部日志的级别 Off 关闭 | Trace|Debug|Info|Warn|Error|Fatal Off为关闭 |
internalLogFile | 把内部的调试和异常信息写入指定的文件 | 指定路径下的文件名称,自定义 |
在配置文件的根元素中,我们可以指定如下的子元素。其中前两个是必须设定的,其余三个为可选设定。
- <targets async="true">
-
-
-
-
- <target name="allfile" xsi:type="File"
- fileName="${basedir}/adminlogs/all.txt"
- archiveFileName="${basedir}/adminlogs/all.{###}.txt"
- archiveEvery="Day"
- archiveNumbering="DateAndSequence"
- archiveAboveSize="20000000"
- maxArchiveFiles="30"
- keepFileOpen="true"
- layout="${longdate} | ${event-properties:item=EventId_Id} | ${uppercase:${level}} | ${logger} | ${aspnet-request-iP:CheckForwardedForHeader=true} | ${event-properties:item=user} | ${aspnet-request-url} | ${message} | ${event-properties:item=requestParam} | ${event-properties:item=jsonResult} | ${onexception:${exception:format=tostring}"/>
- targets>
Nlog允许用户配置单个文件大小, 放置在内容过长效率过慢,配置了大小之后, Nlog会自动创建一个新的文件副本,插入新的日志输出。
常用的参数配置说明:
参数名 | 说明 | 备注 |
name | 输出目标的名称,用于rules中路由规则writeTo指定 | |
layout | 用来规定输出内容格式,语法“${属性}”,可以把上下文信息插入到日志中 | 详情参见3.2.1.1layout |
xsi:type | 输出类型 | |
fileName | 包含完整的生成文件的路径和文件名 | 以下值使NLog根据应用程序运行目录中的日志级别将日志事件写入文件${basedir}/${level}.log所有调试消息将转到Debug.log,所有信息消息将转到Info.log,依此类推。您可以组合任意数量的布局渲染器来生成任意的日志文件名 |
maxArchiveFiles | 应保留的存档文件的最大数量 | |
archiveAboveSize | 日志文件将自动存档的大小(以字节为单位) | |
archiveEvery | 指示是否在每次指定时间过后自动存档日志文件 |
targets更多参数配置参见:File target · NLog/NLog Wiki · GitHub
layout参数配置用来规定输出内容格式,必填项及默认值:${longdate}|${level:uppercase=true}|${logger}|${message:withexception=true}
呼叫站点和堆栈跟踪
条件
上下文信息
专柜
日期和时间
编码和字符串转换
环境和配置文件
文件和目录
身分识别
整合方式
进程,线程和程序集
Silverlight
Web,ASP.NET和ASP.NET Core
规则部分控制如何将Logger对象中的LogEvents重定向到输出目标。其中记录器名称和日志级别可用于筛选。
当创建一个NLogLogger对象时,必须提供一个类似NLog.LogManager.GetLogger的记录器名称(“我的记录器名称”)。也可以使用NLog.LogManager.GetCurrentClassLogger()从类上下文中提取记录器名称,其中记录器名称变为“NameSpace.ClassName”。
- <rules>
-
-
- <logger name="*" minlevel="Trace" writeTo="allfile" />
-
- <logger name="*" minLevel="Debug" writeTo="console"/>
-
- <logger name="Microsoft.*" writeTo="blackhole" final="true" />
-
- rules>
参数配置说明
参数名 | 说明 | 备注 |
name | 匹配logger对象的记录器名称-可能包括通配符(* and ?) | |
minlevel | 要记录的最低级别(与指定级别和以上级别相匹配) | |
maxlevel | 要记录的最大级别(与指定级别和以下级别匹配) | |
level | 要记录的单个级别 | |
levels | 要记录的级别的逗号分隔列表 | |
writeTo | 要写入的目标的逗号分隔列表 | |
final | 最终规则匹配后不处理任何规则 | |
enabled | 设置为false可禁用规则而不删除它 | |
ruleName | 允许使用配置进行规则查找的规则标识符 | |
finalMinLevel | 记录器匹配将被限制为以下规则的指定最低级别 |
官方文档参见:https://github.com/NLog/NLog/wiki/Configuration-file#rules
可以将扩展配置为包括其他NLog包或自定义包:
只需在<extensions/>中的配置中引用DLL
- <extensions>
- <add assembly="NLog.Web.AspNetCore" />
- extensions>
NLog提供了包含文件功能,因此配置可以存储在多个文件中
<include file="nlog-common.config" />
与NLog-config中的大多数属性一样,file属性可能引用变量。下面的示例包括一个与nlog运行的计算机名称相同的文件。
<include file="${machinename}.config"/>
NLog配置变量允许您通过减少重复文本来简化配置。变量可用于为常用的(或长而复杂的)NLog布局指定人名。这样可以更容易地组织和构造NLog配置。
- <variable name="logDir" value="${basedir}/nlogs/${date:format=yyyyMMdd}/${level}.log"/>
输出日志到数据库参见:Database target · NLog/NLog Wiki · GitHub