NLog详解

目录

1.简介

2.项目中使用NLog

2.1 快速使用NLog

2.2 通过配置文件使用NLog

3.NLog配置参数详解

3.1 全局配置

3.2 根元素

3.2.1 targets

3.2.1.1 layout

3.2.2 rules

3.2.3 extensions

3.2.4 include

3.2.5 variable

4.附录


1.简介

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

2.项目中使用NLog

首先使用VS2022创建基于.Net6的WebApi项目MyNLog,然后项目中创建类库项目MyNLog.Utils

2.1 快速使用NLog

1)MyNLog.Utils项目,从nuget中引入NLog

2) MyNLog.Utils项目中创建类NLogService.cs,使用NLog最简单的方法写日志

using NLog;

namespace MyNLog.Utils
{
    public class NLogService
    {
        /// <summary>
        /// 写日志
        /// </summary>
        /// <param name="content"></param>
        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<WeatherForecastController> _logger;

        //public WeatherForecastController(ILogger<WeatherForecastController> logger)
        //{
        //    _logger = logger;
        //}

        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> 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中看见写入的日志

2.2 通过配置文件使用NLog

参见 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;
		/// <summary>
		/// 
		/// </summary>
		static NLogService()
		{
			//判断配置文件NLog.config是否存在
			bool flag = File.Exists(Path.Combine(Path.GetDirectoryName(typeof(NLogService).Assembly.Location), "NLog.config"));
			//获取配置信息
			LogManager.Configuration = GetXmlLoggingConfiguration(!flag);
		}
		/// <summary>
		/// 
		/// </summary>
		private NLogService()
		{
		}
		/// <summary>
		/// logger 初始化
		/// </summary>
		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));
		}
		/// <summary>
		/// 获取logger 配置信息
		/// </summary>
		/// <param name="fromManifestResource"></param>
		/// <returns></returns>
		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;
		}
		/// <summary>
		/// write info log
		/// </summary>
		/// <param name="msg"></param>
		public static void Info(string msg)
		{
			SetLogger();
			_logger.Info(msg);
		}
		/// <summary>
		/// write warn log
		/// </summary>
		/// <param name="msg"></param>
		public static void Warn(string msg)
		{
			SetLogger();
			_logger.Warn(msg);
		}
		/// <summary>
		/// write debug log
		/// </summary>
		/// <param name="msg"></param>
		public static void Debug(string msg)
		{
			SetLogger();
			_logger.Debug(msg);
		}
		/// <summary>
		/// write error log
		/// </summary>
		/// <param name="msg"></param>
		public static void Error(string msg)
		{
			SetLogger();
			_logger.Error(msg);
		}
		/// <summary>
		/// write exception log
		/// </summary>
		/// <param name="e"></param>
		public static void Exception(Exception e)
		{
			SetLogger();
			_logger.Error<Exception>(e);
		}
	}
}

2)接口启动项目中,新增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"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      internalLogLevel="Info"
      internalLogFile="nlog-internal.log">

	<!--Nlog 文档参考地址:https://github.com/NLog/NLog/wiki-->
	<!--internalLogLevel Nlog内部日志记录为Off关闭。除非纠错,不可以设为Trace否则速度很慢,起码Debug以上-->
	<!--自定义日志输出文件路径及命名规则-->
	<variable name="logDir" value="${basedir}/nlogs/${date:format=yyyyMMdd}/${level}.log"/>
	<!-- Load the ASP.NET Core plugin,enable asp.net core layout renderers-->
	<extensions>
		<add assembly="NLog.Web.AspNetCore" />
	</extensions>
	<!--define various log targets-->
	<targets async="true">
		<!--写入文件-->
		<!--滚动日志文件上限数,滚动日志文件数达到上限新的文件内容会覆盖旧文件内容 -->
		<!--archiveAboveSize每个日志文件大小的最大值(单位:字节),主日志文件超过大小超过该值时会将文件内容写入滚动日志并清空主日志文件内容-->
		<!--${basedir}表示当前应用程序域所在的根目录-->
		<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}"/>

		<!--SQL-->
		<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}"/>
		<!--SQL写入控制台-->
		<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>
	<!--define various log rules-->
	<rules>
		<!-- 除非调试需要,把 .NET Core 程序集的 Debug 输出都屏蔽 Trace -> Debug-> Info ->Warn-> Error-> Critical-->
		<!--All logs, including from Microsoft-->
		<logger name="*" minlevel="Trace" writeTo="allfile" />
		<!-- 除非调试需要,把系统的 Debug 输出都屏蔽 -->
		<logger name="*" minLevel="Debug" writeTo="console"/>
		<!--跳过所有级别的Microsoft组件的日志记录-->
		<logger name="Microsoft.*" writeTo="blackhole" final="true" />		
		<!--<logger name="System.*" writeTo="blackhole" final="true" />-->
	</rules>
</nlog>

项目运行后的日志:

 

3.NLog配置参数详解

关于配置文件相关参数说明参见:https://github.com/NLog/NLog/wiki/Configuration-file

3.1 全局配置

<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">

 

参数名称说明参数值
autoReload修改配置文件后是否允许自动加载无须重启程序true/false
throwExceptions内部日志系统抛出异常true/false
internalLogLevel可选Trace|Debug|Info|Warn|Error|Fatal决定内部日志的级别 Off 关闭

Trace|Debug|Info|Warn|Error|Fatal

Off为关闭

internalLogFile把内部的调试和异常信息写入指定的文件指定路径下的文件名称,自定义

3.2 根元素

在配置文件的根元素中,我们可以指定如下的子元素。其中前两个是必须设定的,其余三个为可选设定。
  • targets:定义日志的输出目标
  • rules:定义对日志信息的路由规则
  • extensions:定义从其他dll文件中加载的NLog扩展模块
  • include:引入外部的配置文件
  • variable:定义配置文件中用到的变量

3.2.1 targets

<targets async="true">
		<!--写入文件-->
		<!--滚动日志文件上限数,滚动日志文件数达到上限新的文件内容会覆盖旧文件内容 -->
		<!--archiveAboveSize每个日志文件大小的最大值(单位:字节),主日志文件超过大小超过该值时会将文件内容写入滚动日志并清空主日志文件内容-->
		<!--${basedir}表示当前应用程序域所在的根目录-->
		<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

3.2.1.1 layout

layout参数配置用来规定输出内容格式,必填项及默认值:${longdate}|${level:uppercase=true}|${logger}|${message:withexception=true}

  • $ {cached} -  将缓存应用于另一个布局输出。
  • $ {db-null} - 为数据库渲染DbNull
  • $ {exception} - 通过调用Logger方法之一提供的异常信息
  • $ {level} - 日志级别(例如ERROR,DEBUG)或级别序数(数字)
  • $ {literal} - 字符串文字。(文本)-有用,以逃避括号
  • $ {logger} - 记录器名称。GetLogger,GetCurrentClassLogger等
  • $ {message} - (格式化的)日志消息。
  • $ {newline} - 换行文字。
  • $ {object-path} -  渲染对象的(嵌套)属性
  • $ {onexception} -  仅在为日志消息定义了异常时才输出内部布局。
  • $ {var} - 渲染变量

呼叫站点和堆栈跟踪

  • $ {callsite} - 调用站点(类名,方法名和源信息)
  • $ {callsite-linenumber} - 呼叫站点源行号。
  • $ {stacktrace} - 渲染堆栈跟踪

条件

  • $ {when} -  仅在满足指定条件时输出内部布局。
  • $ {whenempty} -  当内部布局产生空结果时,输出替代布局。

上下文信息

  • $ {activityid} - 将System.Diagnostics跟踪关联ID记录到日志中。
  • $ {all-event-properties} - 记录所有事件上下文数据。
  • $ {event-context} -  记录事件属性数据-替换为$ {event-properties}
  • $ {event-properties} - 记录事件属性数据-重命名$ {event-context}
  • $ {gdc} - 全局诊断上下文项。包含每个应用程序实例值的字典结构。
  • $ {install-context} - 安装参数(传递给InstallNLogConfig)。
  • $ {mdc} - 映射诊断上下文-线程局部结构。
  • $ {mdlc} - 异步映射诊断上下文-线程局部结构。MDC的异步版本
  • $ {ndc} - 嵌套诊断上下文-线程局部结构。
  • $ {ndlc} - 异步嵌套诊断上下文-线程本地结构。

专柜

  • $ {counter} - 一个计数器值(在每个布局渲染中增加)
  • $ {guid} - 全局唯一标识符(GUID)。
  • $ {sequenceid} - 日志序列号

日期和时间

  • $ {date} - 当前日期和时间。
  • $ {longdate} - 日期和时间,采用可排序的长格式`yyyy-MM-dd HH:mm:ss.ffff`。
  • $ {qpc} - 高精度计时器,基于QueryPerformanceCounter返回的值。
  • $ {shortdate} - 短日期,格式为yyyy-MM-dd。
  • $ {ticks} - 当前日期和时间的“ Ticks”值。
  • $ {时间} - 在24小时,可排序的格式HH的时间:MM:ss.mmm。

编码和字符串转换

  • $ {json-encode} -  使用JSON规则转义另一个布局的输出。
  • $ {left} -  文字的左半部分
  • $ {小写} -  将另一个布局输出的结果转换为小写。
  • $ {norawvalue} -  防止将另一个布局渲染器的输出视为原始值
  • $ {pad} -  将填充应用于另一个布局输出。
  • $ {replace} -  将另一个布局的输出中的字符串替换为另一个字符串。正则表达式可选
  • $ {replace-newlines} -  用另一个字符串替换换行符。
  • $ {right} -  文字的右侧
  • $ {rot13} -  使用ROT-13解码“加密”的文本。
  • $ {substring} -  文本的子字符串
  • $ {trim-whitespace} -  从另一个布局渲染器的结果修剪空白。
  • $ {uppercase} -  将另一个布局输出的结果转换为大写。
  • $ {url-encode} -  编码另一个布局输出的结果,以供URL使用。
  • $ {wrapline} -  以指定的行长包装另一个布局输出的结果。
  • $ {xml-encode} -  将另一个布局输出的结果转换为XML兼容的。

环境和配置文件

  • $ {appsetting} -. config文件 NLog.Extended中的应用程序配置设置
  • $ {configsetting} - 来自appsettings.json或ASP.NET Core和.NET Core中其他配置的值 NLog.Extensions.Logging NLog.Extensions.Hosting NLog.Web.AspNetCore
  • $ {environment} - 环境变量。(例如PATH,OSVersion)
  • $ {environment-user} - 用户身份信息(用户名)。
  • $ {}注册表 - 从Windows注册表中的值。

文件和目录

  • $ {basedir} - 当前应用程序域的基本目录。
  • $ {currentdir} - 应用程序的当前工作目录。
  • $ {file-contents} - 呈现指定文件的内容。
  • $ {filesystem-normalize} -  通过将文件名替换为安全字符来过滤文件名中不允许的字符。
  • $ {} nlogdir - 其中NLog.dll所在的目录。
  • $ {specialfolder} - 系统专用文件夹路径(包括“我的文档”,“我的音乐”,“程序文件”,“桌面”等)。
  • $ {tempdir} - 临时目录。

身分识别

  • $ {identity} - 线程身份信息(名称和身份验证信息)。
  • $ {windows-identity} - 线程Windows身份信息(用户名)
  • $ {windows-identity} - 线程Windows身份信息(用户名) Nlog.WindowsIdentity

整合方式

  • $ {gelf} - 将日志转换为GELF格式 NLog.GelfLayout 外部
  • $ {log4jxmlevent} - 与log4j,Chainsaw和NLogViewer兼容的XML事件描述。

进程,线程和程序集

  • $ {appdomain} - 当前的应用程序域。
  • $ {assembly-version} - 默认应用程序域中可执行文件的版本。
  • $ {gc} - 有关垃圾收集器的信息。
  • $ {hostname} - 运行该进程的计算机的主机名。
  • $ {local-ip} - 来自网络接口的本地IP地址。
  • $ {machinename} - 运行进程的计算机名。
  • $ {performancecounter} - 性能计数器。
  • $ {processid} - 当前进程的标识符。
  • $ {processinfo} - 有关正在运行的进程的信息。例如StartTime,PagedMemorySize
  • $ {processname} - 当前进程的名称。
  • $ {processtime} - 格式为HH:mm:ss.mmm的处理时间。
  • $ {threadid} - 当前线程的标识符。
  • $ {threadname} - 当前线程的名称。

Silverlight

  • $ {document-uri} - 承载当前Silverlight应用程序的HTML页面的URI。
  • $ {sl-appinfo} - 有关Silverlight应用程序的信息。

Web,ASP.NET和ASP.NET Core

  • $ {ASPNET-appbasepath} - ASP.NET应用程序的基本路径(内容根) NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET应用} - ASP.NET应用程序变量。 网络日志
  • $ {ASPNET环境} - ASP.NET环境名称 NLog.Web.AspNetCore
  • $ {ASPNET项} - ASP.NET`HttpContext`项变量。 NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET-MVC-行动} - ASP.NET MVC动作名称 NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET-MVC控制器} - ASP.NET MVC控制器名称 NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET请求} - ASP.NET请求变量。 NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET-请求的contentType} - ASP.NET Content-Type头(实施例应用/ JSON) NLog.Web.AspNetCore
  • $ {ASPNET请求,饼干} - ASP.NET请求的cookie的内容。 NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET请求形式} - ASP.NET请求表的内容。 NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET请求报头} - ASP.NET部首键/值对。 NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET请求主机} - ASP.NET请求主机。 NLog.Web NLog.Web.AspNetCore
  • $ {aspnet-request-ip} - 客户端IP。 NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET请求-方法} - ASP.NET请求方法(GET,POST等)。 NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET请求,贴体} - ASP.NET贴体/净荷 NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET-请求的查询字符串} - ASP.NET请求的查询字符串。 NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET,请求引荐} - ASP.NET请求引用。 NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET请求的URL} - ASP.NET请求URL。 NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET请求,用户代理} - ASP.NET请求用户代理。 NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET-响应的StatusCode} - ASP.NET响应状态代码的内容。 NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET会话} - ASP.NET Session变量。 NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET-的SessionID} - ASP.NET会话ID的变量。 NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET-traceidentifier} - ASP.NET跟踪标识 NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET用户-的authType} - ASP.NET用户验证。 NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET用户身份} - ASP.NET用户变量。 NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET用户-isauthenticated} - ASP.NET用户身份验证? NLog.Web NLog.Web.AspNetCore
  • $ {ASPNET-webrootpath} - ASP.NET Web根目录路径(wwwroot文件) NLog.Web NLog.Web.AspNetCore
  • $ {iis-site-name} - IIS网站的名称。 NLog.Web NLog.Web.AspNetCore

3.2.2 rules

规则部分控制如何将Logger对象中的LogEvents重定向到输出目标。其中记录器名称和日志级别可用于筛选。

当创建一个NLogLogger对象时,必须提供一个类似NLog.LogManager.GetLogger的记录器名称(“我的记录器名称”)。也可以使用NLog.LogManager.GetCurrentClassLogger()从类上下文中提取记录器名称,其中记录器名称变为“NameSpace.ClassName”。

<rules>
		<!-- 除非调试需要,把 .NET Core 程序集的 Debug 输出都屏蔽 Trace -> Debug-> Info ->Warn-> Error-> Critical-->
		<!--All logs, including from Microsoft-->
		<logger name="*" minlevel="Trace" writeTo="allfile" />
		<!-- 除非调试需要,把系统的 Debug 输出都屏蔽 -->
		<logger name="*" minLevel="Debug" writeTo="console"/>
		<!--跳过所有级别的Microsoft组件的日志记录-->
		<logger name="Microsoft.*" writeTo="blackhole" final="true" />		
		<!--<logger name="System.*" 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

3.2.3 extensions

可以将扩展配置为包括其他NLog包或自定义包:

只需在<extensions/>中的配置中引用DLL

<extensions>
  <add assembly="NLog.Web.AspNetCore" />
</extensions>

3.2.4 include

NLog提供了包含文件功能,因此配置可以存储在多个文件中

<include file="nlog-common.config" />

与NLog-config中的大多数属性一样,file属性可能引用变量。下面的示例包括一个与nlog运行的计算机名称相同的文件。

<include file="${machinename}.config"/>

3.2.5 variable

NLog配置变量允许您通过减少重复文本来简化配置。变量可用于为常用的(或长而复杂的)NLog布局指定人名。这样可以更容易地组织和构造NLog配置。

<!--自定义日志输出文件路径及命名规则-->
<variable name="logDir" value="${basedir}/nlogs/${date:format=yyyyMMdd}/${level}.log"/>

4.附录

输出日志到数据库参见:Database target · NLog/NLog Wiki · GitHub

输出日志到控制台参见:ColoredConsole target · NLog/NLog Wiki · GitHub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/105953.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

minio + linux + docker + spring boot实现文件上传与下载

minio docker spring boot实现文件上传与下载 1.在linux上安装并启动docker2.在docker中拉取minio并启动3.Spring Boot 整合 minio4.测试 minio 文件上传、下载及图片预览等功能 1.在linux上安装并启动docker 检查linux内核&#xff0c;必须是3.10以上 uname ‐r安装docker…

基于aop 代理 Sentinel Nacos配置控制包装类实现原理

基于aop & 代理 & Sentinel & Nacos配置控制包装类实现原理 Hi&#xff0c;我是阿昌&#xff0c;今天记录下看sentinel源码结合业务实现的思路基于aop & 代理 & Sentinel & Nacos配置控制包装类实现原理&#xff1b;下面并不会手把手的记录方案的实现…

绿野仙踪不仅是童话,还是便宜又好用的产品测试法!

以 ChatGPT 为代表的大语言模型爆火后&#xff0c;推动了对话类人工智能产品的高速发展&#xff0c;我们已经看到了如智能助理、问答系统、自动写作等多种类型的个性化对话类 AI 服务。 AI 能力的提升让人们对智能 AI 产品的期望越来越高&#xff0c;相关产品的用户体验也因此变…

基于springboot实现校友社交平台管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校友社交平台管理系统演示 摘要 校友社交系统提供给用户一个校友社交信息管理的网站&#xff0c;最新的校友社交信息让用户及时了解校友社交动向,完成校友社交的同时,还能通过论坛中心进行互动更方便。本系统采用了B/S体系的结构&#xff0c;使用了java技…

PPT文档图片设计素材资源下载站模板源码/织梦内核(带用户中心+VIP充值系统+安装教程)

源码简介&#xff1a; PPT文档图片设计素材资源下载站模板源码&#xff0c;作为织梦内核素材资源下载站源码&#xff0c;它自带了用户中心和VIP充值系统&#xff0c;也有安装教程。 织梦最新内核开发的模板&#xff0c;该模板属于素材下载、文档下载、图库下载、PPT下载、办公…

疯狂java 三-六章

第三章 数据类型和运算符 Java语言是强类型语言&#xff0c;意思是每个变量和每个表达式都有一个在编译时就确定的类型&#xff0c;所有的变量都必须显式声明类型 标识符就是类&#xff0c;变量、方法命名的符号 标识符不能包含空格 标识符只能包含美元符($)&#xff0c;不…

python自动化测试平台开发:自动化测试平台简介

一.测试平台简介 为什么需要测试平台 已有的开源测试平台不能满足需要&#xff0c;不要轻易造轮子 需要公司级别的定制 需要整合公司内部的多套平台 例子&#xff1a;DevOps平台、精准化测试平台、质量监控平台等等 常见的测试平台开发模式 大一统模式&#xff08;适合简单的…

基于springboot实现校友社交平台管理系统项目【项目源码+论文说明】

基于springboot实现校友社交平台管理系统演示 摘要 校友社交系统提供给用户一个校友社交信息管理的网站&#xff0c;最新的校友社交信息让用户及时了解校友社交动向,完成校友社交的同时,还能通过论坛中心进行互动更方便。本系统采用了B/S体系的结构&#xff0c;使用了java技…

STM32-程序占用内存大小计算

STM32中程序占用内存容量 Keil MDK下Code, RO-data,RW-data,ZI-data这几个段: Code存储程序代码。 RO-data存储const常量和指令。 RW-data存储初始化值不为0的全局变量。 ZI-data存储未初始化的全局变量或初始化值为0的全局变量。 占用的FlashCode RO Data RW Data; 运行消…

如何为你的地图数据设置地图样式?

地图样式设置是GIS系统中非常重要的功能模块&#xff0c;水经微图Web版本最近对符号样式功能模块进行了升级。 你可以通过以下网址直接打开访问&#xff1a; https://map.wemapgis.com 现在我们为大家分享一下水经微图Web版中&#xff0c;如何为你标注的地图数据设置地图样式…

微信小程序——后台交互

目录 后台准备 pom.xml 配置数据源 整合mtbatis 前后端交互 method1 method2 后台准备 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org…

postgresSQL 数据库本地创建表空间读取本地备份SQL文件

使用pgAdmin4&#xff0c;你安装PG得文件夹****/16/paAdmin 4 /runtime/pgAdmin4.exe 第一步&#xff1a;找到Tablespaces 第二步&#xff1a;创建表空间名称 第三步&#xff1a;指向数据文件 第四步&#xff1a;找到Databases&#xff0c;创建表空间 第五步&#xff1a;输入数…

Jmeter性能测试:高并发分布式性能测试

​一、为什么要进行分布式性能测试 当进行高并发性能测试的时候&#xff0c;受限于Jmeter工具本身和电脑硬件的原因&#xff0c;无法满足我们对大并发性能测试的要求。 基于这种场景下&#xff0c;我们就需要采用分布式的方式来实现我们高并发的性能测试要求。 二、分布式性能…

Zeth:首个Type 0 zkEVM

1. 引言 一年前&#xff0c;V神博客The different types of ZK-EVMs中指出&#xff1a; 以太坊初始设计未围绕ZK友好性&#xff0c;因此&#xff0c;以太坊协议的很多部分都需要大量计算来做ZK-prove。Type 1 zkEVM致力于精准复制以太坊&#xff0c;因此它没有办法减轻这些低…

台积电2纳米黑科技 - 晶背供电 | 百能云芯

近期&#xff0c;台积电总裁魏哲家在一次法说会中透露了有关2纳米芯片的最新进展&#xff0c;并提到了“晶背供电”技术&#xff0c;这个领域的神秘黑科技正逐渐引起人们的兴趣。 在最近的台积电法说会上&#xff0c;总裁魏哲家不仅提到了2纳米制程的进展&#xff0c;还透露&am…

向量检索库Milvus架构及数据处理流程

文章目录 背景milvus想做的事milvus之前——向量检索的一些基础近似算法欧式距离余弦距离 常见向量索引1&#xff09; FLAT2&#xff09; Hash based3&#xff09; Tree based4&#xff09; 基于聚类的倒排5&#xff09; NSW&#xff08;Navigable Small World&#xff09;图 向…

Linux-安装docker-compose

前言&#xff1a;本文建立在服务器中已经存在docker环境的基础上&#xff0c;总结了安装docker-compose过程&#xff0c;以及安装过程中遇到的问题和解决方案。 一、下载docker-compose 在网上找了两种&#xff0c;一种是github官方的&#xff0c;一种是国内的镜像 gitbub官…

2023年9月青少年机器人技术(五级)等级考试试卷-实操题

2023.09青少年机器人技术&#xff08;五级&#xff09;等级考试试卷-实操题 主题&#xff1a;串口交互数字滚动循环显示 器件&#xff1a;ESP32主控板1块&#xff0c;四位数码管1个&#xff0c;74HC595移位寄存器芯片&#xff08;或模块&#xff09;及相应辅件。以上模块也可…

ubuntu 安装串口工具和添加虚拟串口

目录 一、串口工具安装 二、使用Windows本身虚拟的串口 &#xff08;一&#xff09;添加串口 1、保证虚拟机是关闭状态&#xff0c;打开“虚拟机设置”&#xff0c;点击“添加”。 2、选中“串行端口”&#xff0c;点击“完成”。 3、选中刚添加的串口&#xff0c;下拉选…

分享119个ASP.NET源码总有一个是你想要的

分享119个ASP.NET源码总有一个是你想要的 链接&#xff1a;https://pan.baidu.com/s/1Mp0RugMnIJbS8Hrja4sCOQ?pwd8888 提取码&#xff1a;8888 项目名称 asp.net core 微服务 项目 ASP.NET Core 项目日志解决方案 Serilog Log4net ASP.NET Core分布式项目实战 asp.n…