
📣读完这篇文章里你能收获到
- Nlog输出至文件/RabbitMQ/远程网络Tcp配置文档
- Nlog配置参数详解
- .NET CORE项目接入
- 感谢点赞+收藏,避免下次找不到~

一、概念篇
1 NLog介绍
NLog是一个简单灵活的.NET日志记录类库,NLog的API非常类似于log4net,且配置方式非常简单。通过使用NLog,我们可以在任何一种.NET语言中输出带有上下文的调试信息,根据项目需求配置署出格式和输出目标的规则。
NLog使用路由进行配置,但log4net却使用层次性的appender配置,这样就让NLog的配置文件非常容易阅读,并便于今后维护。
支持多种形式输出日志:文本文件 系统日志 数据库 控制台 邮箱 等
2 配置文件参数
- targets和rules
<targets /> - 定义日志的目标/输出,下级是<target>
<rules /> - 定义日志的路由规则,下级是<logger>
- nlog标签
autoReload修改配置文件后是否允许自动加载无须重启程序throwExceptions内部日志系统抛出异常internalLogLevel可选Trace|Debug|Info|Warn|Error|Fatal决定内部日志的级别 Off 关闭internalLogFile把内部的调试和异常信息都写入指定文件里- 建议throwExceptions的值设为
false,这样由于日志引发的问题不至于导致应用程序的崩溃
- targets标签
<target />区域定义了日志的目标或者说输出 ,在这里可以按需设置文件名称和格式,输出方式
name:自定义该target的名字,可供rule规则里使用type: 定义类型,官方提供的可选类型有:
Chainsaw|ColoredConsole |Console |Database|Debug|Debugger|EventLog|File|LogReceiverService|Mail|Memory|MethodCall|Network |NLogViewer|Null |OutputDebugString|PerfCounter|Trace|WebService
- layouts 标签
- 用来规定布局样式,语法“${属性}”,可以把上下文信息插入到日志中,官方提供的可以用的属性见文末附录
- rules标签
各种规则配置在logger子标签里
name - 记录者的名字
minlevel - 最低级别
maxlevel - 最高级别
level - 单一日志级别
levels - 一系列日志级别,由逗号分隔
writeTo - 规则匹配时日志应该被写入的一系列目标,由逗号分隔
- variable标签
变量定义
<variable name="variable1" value="${basedir}/logs"/>
<targets>
<target name="File" xsi:type="File" fileName="${variable1}/${shortdate}.txt"/>
</targets>

二、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">
<!--<variable name="logDirectory" value="E:/Log"/>-->
<!--按照小时记录-->
<targets>
<!--此部分中的所有目标将自动异步-->
<default-wrapper xsi:type="AsyncWrapper"></default-wrapper>
<!--项目日志保存文件路径说明fileName="${basedir}/保存目录,以年月日的格式创建/${shortdate}/${记录器名称}-${单级记录}-${shortdate}.txt"-->
<target xsi:type="File"
name="info"
fileName="${basedir}/info/${date:format=yyyy-MM-dd-HH}.txt"
layout ="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}"/>
<target xsi:type="File"
name="error"
fileName="${basedir}/error/${date:format=yyyy-MM-dd-HH}.txt"
layout ="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}"/>
<!--网络发送
<target name="logstash" xsi:type="Network" address="tcp://127.0.0.1:9900" keepConnection="false"
layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}"/>-->
<!--发送到RabbitMQ-->
<!--<extensions>
<add assembly="Nlog.RabbitMQ.Target" />
</extensions>
<targets async="true">
<target name="RabbitMQTarget"
xsi:type="RabbitMQ"
username="guest"
password="guest"
hostname="localhost"
port="5672"
vhost="/"
appid="NLog.RabbitMQ.TuDou"
topic="TuDou.Logging.${level}"
exchange="aggregateservice-log"
exchangeType="topic"
useJSON="true"
layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
</targets>-->
<!-- ElasticSearch发送
<target name="elastic" xsi:type="BufferingWrapper" flushTimeout="5000">
<target xsi:type="ElasticSearch" includeAllProperties="true" index="logstash-20200805" uri="http://localhost:9200" />
</target> -->
</targets>
<rules>
<logger name="*" level="Info" writeTo="info" />
<logger name="*" level="Error" writeTo="error" />
<!--<logger name="*" level="Info,Error" writeTo="RabbitMQTarget" />-->
</rules>
</nlog>


三、.NET Core调用方法
1 Nuget依赖包下载
Nlog、Nlog Configuration
- 在nuget程序包管理界面上,搜索安装Nlog 和Nlog configuration,这样会自动生成一个config文件,这样和程序或者web自己的config区分开方便日后使用管理,互不影响

如果通过RabbitMQ,则需要引入Nlog.RabbitMQ.Target
2 代码引入
Program中引入:
调用时注入:

四、附录
附录:layouts 属性
| ${activityid} | 将其置入日志System.Diagnostics trace |
|---|---|
| ${all-event-properties} | 事件日志上下文 |
| ${appdomain} | 当前应用程序域 |
| ${assembly-version} | 应用程序 |
| ${basedir} | 应用程序域的基本目录。 |
| ${callsite} | (类名称、方法名称和相关信息的源信息)。 |
| ${callsite-linenumber} | 调用类的 |
| ${counter} | 数值 |
| ${date} | 当前日期和时间。 |
| ${document-uri} | 用于Silverlight应用。 |
| ${environment} | 环境变量 |
| ${event-properties} | |
| ${exception} | exception信息 |
| ${file-contents} | 显示指定文件的内容 |
| ${gc} | 垃圾收集器 |
| ${gdc} | 诊断上下文 |
| ${guid} | GUID |
| ${identity} | 线程标识信息 |
| ${install-context} | 安装参数 |
| ${level} | 级别。 |
| ${literal} | |
| ${log4jxmlevent} | XML事件描述 |
| ${logger} | 记录器的名字 |
| ${longdate} | 日期和时间的格式分类yyyy-MM-dd HH:mm:ss.ffff。 |
| ${machinename} | 名称 |
| ${mdc} | 映射诊断 |
| ${mdlc} | 异步映射诊断上下文 |
| ${message} | 消息 |
| ${ndc} | 线程结构 |
| ${ndlc} | 异步线程 |
| ${newline} | 文字换行 |
| ${nlogdir} | nlog.dll目录。 |
| ${performancecounter} | 述性能计数器。 |
| ${processid} | 当前进程标识符 |
| ${processinfo} | 运行信息 |
| ${processname} | 当前进程的名称。 |
| ${processtime} | 该时间过程中格式HH:MM:ss.mmm。 |
| ${qpc} | 高精度定时器,基于返回的值从queryperformancecounter(任选地)转换为秒。 |
| ${registry} | 从注册表中的值。 |
| ${sequenceid} | ID |
| ${shortdate} | 短时间 格式YYYY-MM-DD。 |
| ${sl-appinfo} | Silverlight应用。 |
| ${specialfolder} | 文件夹路径 |
| ${stacktrace} - | 堆栈跟踪渲染器。 |
| ${tempdir} | 临时目录中。 |
| ${threadid} | 当前线程的标识符。 |
| ${threadname} | 当前线程。 |
| ${ticks} | 当前日期和时间。 |
| ${time} | 24小时格式HH:MM:ss.mmm。 |
| ${var} | {$var}-提供新的变量(4.1) |
| ${windows-identity} | indows线程标识信息(用户名) |
官方参考:
https://github.com/nlog/NLog/wiki/Layout%20Renderers
https://github.com/nlog/NLog/wiki/Targets
https://github.com/NLog/NLog/releases/
http://nlog-project.org/