NLog详解

news2024/12/17 9:44:24

目录

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++代码】分糖,分饼干,摇摆序列,贪心算法--代码随想录

贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。靠自己手动模拟&#xff0c;如果模拟可行&#xff0c;就可以试一试贪心策略&#xff0c;如果不可行&#xff0c;可能需要动态规划。贪心算法一般分为如下四步&#xff1a; 将问题分解为若干个子问题找出适合的…

Shell 邮件发送告警测试

1.先编辑mail配置文件 #cat /etc/mail.rc#开启ssl set ssl-verifyignore#证书目录&#xff0c;下方为centos系统证书默认位置&#xff0c;也自行生成证书并指定 set nss-config-dir/etc/pki/nssdb# 配置的第三方smtp服务器的地址及端口 set smtpsmtps://smtp.163.com:465 # 认…

<多线程章节二>创建线程的几种常见方式

文章专栏 本篇文章收录于多线程&#xff0c;也欢迎翻阅博主的其他文章&#xff0c;可能也会让你有不一样的收获&#x1f604; &#x1f4a1;JavaSE语法 &#x1f4a1;数据结构 &#x1f4a1;多线程 &#x1f4a1;专栏导读 操作系统提供了一些API来操作线程&#xff0c;Java针对…

python把ChestX-Det-Dataset的json样本转为COCO数据集的json格式

ChestX-Det-Dataset数据集网址&#xff1a;https://github.com/Deepwise-AILab/ChestX-Det-Dataset/tree/main 数据集JSON内容&#xff1a; [{"file_name": "36199.png","syms": [],"boxes": [],"polygons": []},{"f…

分享一下怎么做陪诊小程序

在当今快节奏的社会中&#xff0c;人们的生活压力越来越大&#xff0c;尤其是在大城市中&#xff0c;由于工作繁忙&#xff0c;生活节奏快&#xff0c;很多人都感到看病难、看病贵的问题。为了解决这一问题&#xff0c;陪诊小程序应运而生。陪诊小程序是一种可以提供线上预约、…

基于SSM民宿预订及个性化服务系统-计算机毕设 附源码 04846

SSM民宿预订及个性化服务系统 摘 要 伴随着国内旅游经济的迅猛发展民宿住宿行在国内也迎来了前所未有的发展机遇。传统的旅游模式已难以满足游客日益多元化的需求&#xff0c;随着人们外出度假的时间越来越长&#xff0c;导致人们在住宿的选择上更加追求舒适、个性化的住宿体验…

vue+Fullcalendar

vueFullcalendar: vueFullcalendar项目代码https://gitee.com/Oyxgen404/vue--fullcalendar.git

CSS样式(盒子模型,内外边距等设置)

盒子模型 目标&#xff1a;掌握盒子模型组成部分&#xff0c;使用盒子模型布局网页区域 01-选择器 结构伪类选择器 基本使用 作用&#xff1a;根据元素的结构关系查找元素。 选择器说明E:first-child查找第一个E元素E:last-child查找最后一个E元素E:nth-child(N)查找第N个E…

jquery-picture-cut 任意文件上传 (CVE-2018-9208)

jquery-picture-cut 任意文件上传 &#xff08;CVE-2018-9208&#xff09; 漏洞描述 picture cut是一个jquery插件&#xff0c;以非常友好和简单的方式处理图像&#xff0c;具有基于bootstrap或jquery ui的漂亮界面&#xff0c;具有ajax上传&#xff0c;从资源管理器拖动图像…

Error: no matching distribution found for tensorflow-cpu==2.6.*

目录 install_tensorflow()安装过程中遇到的问题 查找解决方案过程中&#xff1a; 解决办法&#xff1a; install_tensorflow()安装过程中遇到的问题 在服务器上安装tensorflow时&#xff0c;遇到了一个报错信息&#xff1a; 在网上找到一个类似的错误&#xff08;TensorFlow…

【EI会议征稿】第二届纯数学、应用数学与计算数学国际学术会议(PACM 2024)

第二届纯数学、应用数学与计算数学国际学术会议&#xff08;PACM 2024&#xff09; 2024 2nd International Cnference on Pure, Applied and Computational Mathematics (PACM 2024) 第二届纯数学、应用数学计算数学国际学术会议 (PACM2024) 将于2024年1月19-21日在中国厦门隆…

利用a标签锚点定位实现切换页面的部分内容

最近在做一个数据可视化大屏的作业&#xff0c;其中需要实现点击不同的按钮&#xff0c;大屏中间内容呈现不同的数据分析图表&#xff0c;页面其他部分不发生改变。之前考虑过复制多个页面然后改变中间的页面&#xff0c;但是这样会导致文件冗余&#xff0c;而且由于静态文件放…

【机器学习项目实战案例目录】项目详解 + 完整源码

前言 大家好&#xff0c;我是阿光。 本专栏整理了《机器学习项目实战案例》&#xff0c;内包含了各种不同的入门级机器学习项目&#xff0c;包含项目原理以及源码&#xff0c;每一个项目实例都附带有完整的代码。 正在更新中~ ✨ &#x1f6a8; 我的项目环境&#xff1a; 平…

为什么要学Selenium自动化测试?

开发人员在编写代码时总是会考虑到不同的应用场景&#xff0c;但也可能会出现实现效果不如预期的情况。同样的原则也适用于测试代码&#xff0c;编写测试代码的主要目的是测试现有产品的功能、发现错误并使产品100%无错误。 有句话说得好&#xff1a;"真相总是比小说更离奇…

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

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

关于接口|常见电商API接口种类|接口数据类型|接口请求方法

常见接口种类# Http/Https接口: 通过http/https协议传送接口数据(通常按字符串/二进制传输), 如常见的网页表单, https安全性更好 RESTful Api: REST表述性状态传递. 一种设计风格,基于http/https协议, 把一切接口视为资源, 接口要分版本,在统一的域名下管理, 不同的方法(get…

MySQL索引揭秘,详解索引概念与作用,让你的数据库查询快如闪电

简介&#xff1a;MySQL索引的建立对于MySQL的高效运行是很重要的&#xff0c;索引可以大大提高MySQL的检索速度。打个比方&#xff0c;如果合理的设计就像汉语字典的目录页&#xff0c;可以按拼音、笔画、偏旁部首等排序的目录快速查找到需要的字。数据库索引用于快速找出在数据…

若依进行tab页面切换时要求不刷新页面 vue3

若依进行tab页面切换时要求不刷新页面 vue3 看看个人中心怎么实现的 然后vue文件是这样的&#xff0c;注意大小写咯

C语言数据结构之数据结构入门

目录 数据结构介绍 数据结构发展史 何为算法 数据结构基础 基本概念和术语 四大逻辑结构&#xff08;Logic Structure&#xff09; 数据类型 理解复杂度概念 时间空间复杂度定义 度量时间复杂度的方法 程序运行时的内存与地址 编程预备 数据结构介绍 数据结构发展…

新框架Nue.js以及如何搭建框架(详细介绍)

先把官方文档已经github放在这里 链接: Nue官方文档&#x1f448;点击即可跳转 链接: Nue官方github&#x1f448;点击即可跳转 入门 NueJS是一个非常小&#xff08;2.3kb minzipped&#xff09;的JavaScript库&#xff0c;用于构建用户界面。它是Nue工具集的核心。它就像Vue.j…