📚NLog使用
📘 引入
- Install the latest NLog from
NuGet. - 从
NuGet也可以下载 NLog.Config,但是只针对于.NET Framework。
#命令行安装也可以
Install-Package 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"
throwExceptions="false"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
<!-- 添加变量-->
<variable name="logDirectory" value="logs"/>
<!--添加target节点,用以指定写入的文件,一个target有一个name,在rules中指定name,相应的规则就会写入相应的文件中-->
<targets>
<target xsi:type="File" name="allfile" fileName="${logDirectory}/nlog-all-${shortdate}.log"
layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" encoding="utf-8"/>
<target xsi:type="File" name="testfile" fileName="${logDirectory}/nlog-test-${shortdate}.log"
layout="${longdate}|${logger}|${uppercase:${level}}|${message:exceptionSeparator=\r\n:withException=true} ${exception:format=Type,Message,Method,StackTrace}" encoding="utf-8"/>
<!-- 不需要的日志记录可以放到黑洞中-->
<target xsi:type="Null" name="blackhole" />
</targets>
<rules>
<!-- 添加rules,name可指定命名空间,或者类 -->
<!-- 添加rules,filter可以添加条件 when -->
<logger name="*" minlevel="Info" writeTo="testfile" >
<filters defaultAction="Ignore">
<when condition="equals(message ,'test')" action="Log"/>
</filters>
</logger>
<!-- MicroSoft相关的日志直接丢进黑洞里 并且因为final的原因,不会向下匹配规则-->
<logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
<logger name="*" minlevel="Info" writeTo="allfile" />
</rules>
</nlog>
📙 targets节点
<target xsi:type="File" name="allfile" fileName="${logDirectory}/nlog-all-${shortdate}.log"
layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" encoding="utf-8"/>
-
作用:
用以指定写入的文件,一个
target有一个name,在rules中指定name,相应的规则就会写入相应的文件中 -
属性:
-
xsi:type:指定写入的形式,可以为txt,email等等 -
name:target的名称属性,用来调用 -
fileName:指定写入的文件名,可以使用变量。 -
layout:写入内容的样式指定。<target layout="${longdate}|${logger}|${uppercase:${level}}|${message:exceptionSeparator=\r\n:withException=true} ${exception:format=Type,Message,Method,StackTrace}" encoding="utf-8"/> -
encoding:写入文件的编码,乱码的时候可以调一调。-
符号含义
:is the value separator.}is the end of the layout
Examples:
${appdomain:format={1\}{0\}}(escape of})${rot13:inner=${scopenested:topFrames=3:separator=x}}(no escaping needed)${when:when=1 == 1:Inner=Test\: Hello}(escape of:)
-
-
其他属性
-
其他说明
${message}说明:LogHelper.Logger.Error(e,"test");🔑如果这样写,
message就是test,如果不写 就是e.Message。
📙 rules节点
<logger name="*" minlevel="Info" writeTo="allfile" />
-
作用及基本属性
通过编写规则实现不同的日志写入不同的文件中,
eg:<targets> <target xsi:type="Null" name="blackhole" /> </targets> <rules> <!--All logs, including from Microsoft--> <logger name="*" minlevel="Trace" writeTo="allfile" /> <!-- Microsoft相关日志 扔进黑洞中--> <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" /> <logger name="*" minlevel="Trace" writeTo="ownFile-web" /> </rules>-
🔑
name:可以使用正则表达式,匹配相应的命名空间,类库 -
minlevel:指定rule记录的最小级别的日志level。 -
writeTo:匹配Target中相应的name,表明该条规则写入的文件是Target的文件 -
🔑
final:最终规则匹配后不处理任何规则,📝:当一条
log进入rules中匹配,他可以匹配很多条规则,所以对应很多的Target,但是如果他匹配到一条规则带有final=true的属性,那他就不会继续向下匹配。
-
-
🔑
filter属性<logger name="*" minlevel="Info" writeTo="testfile" final="true"> <!--defaultAction代表执行的操作 默认的操作--> <filters defaultAction="Ignore"> <!--action代表执行的操作 记录还是忽略--> <when condition="equals(message ,'test')" action="Log"/> </filters> </logger>-
- Predefined Tokens
message- LogEvent 格式化消息logger- 记录器名称level- LogLevel 对象exception- 异常对象(NLog 5.0 引入)${layout}- 所有可用的布局选项(堆栈跟踪除外)。
-
The filter expressions are written in a special mini-language. The language consists of:
- 关系运算符:
==、!=、<、<=和注意:某些>=预定义的*XML 字符**可能需要转义。**例如,如果您尝试使用“<”字符,XML 解析器会将其解释为开始标记,从而导致配置文件中出现错误。相反,在这种情况下使用 ‘<’ 的转义版本。< - 布尔运算符:
and,or,not - 始终作为布局评估的字符串文字 -
${somerenderer} - 布尔文字 -
true和false - 数字文字 - 例如
12345(整数文字)和12345.678(浮点文字) - 日志级别文字 -
LogLevel.Trace,LogLevel.Debug, …LogLevel.Fatal - 用于访问最常见日志事件属性的预定义关键字-
level和message``logger - 大括号 - 覆盖默认优先级并将表达式组合在一起
- 条件函数 - 执行
string和object测试 - 单引号应该用另一个单引号转义。
- 关系运算符:
-
-
contains(s1,s2)确定第二个字符串是否是第一个字符串的子字符串。返回:true当第二个字符串是第一个字符串的子字符串时,false否则。 -
ends-with(s1,s2)确定第二个字符串是否是第一个字符串的后缀。返回:true当第二个字符串是第一个字符串的前缀时,false否则。 -
equals(o1,o2)比较两个对象是否相等。返回:true当两个对象相等时,false否则。 -
length(s)返回字符串的长度。 -
starts-with(s1,s2)确定第二个字符串是否是第一个字符串的前缀。返回:true当第二个字符串是第一个字符串的前缀时,false否则。 -
regex-matches(input, pattern, options)在 NLog 4.5 中引入。指示正则表达式pattern是否在指定input字符串中找到匹配项。options是来自RegexOptions枚举的可选逗号分隔值列表。返回:在输入字符串中找到匹配项时,
true否则
false例子 :
regex-matches('${message}', '^foo$', 'ignorecase,singleline')<rules> <logger name="*" writeTo="file"> <filters defaultAction="Log"> <when condition="exception != null" action="Log" /> <when condition="length(message) > 100" action="Ignore" /> <when condition="length('${OnHasProperties:True}') > 0" action="Ignore" /> <when condition="logger == 'MyApps.SomeClass'" action="Ignore" /> <when condition="(level >= LogLevel.Debug and contains(message, 'PleaseDontLogThis')) or level==LogLevel.Warn" action="Ignore" /> <when condition="not starts-with(message, 'PleaseLogThis')" action="Ignore" /> <when condition="contains(message, '"Bob"')" action="Ignore" /> <!-- "Bob" --> </filters> </logger> </rules>
-
-
<rules> <logger name="*" minlevel="Info" writeTo="logconsole" /> <logger name="Name.Space.*" minlevel="Debug" writeTo="f1" /> <logger name="*.Class1" minlevel="Trace" writeTo="f2" /> <logger name="*.Library.*" minlevel="Warn" writeTo="f3" /> </rules> -
action的枚举类型defaultAction也可以为:Ignore- 不应记录该消息。IgnoreFinal- 不应记录该消息并忽略接下来的记录规则。Log- 应记录该消息。LogFinal- 应记录该消息并忽略接下来的记录规则。Neutral- 过滤器不想决定是记录还是丢弃消息。
-
-
日志level
| Level | Typical Use |
|---|---|
| Fatal | 发生了不好的事情;应用程序正在关闭 |
| Error | 失败了;应用程序可能会或可能不会继续 |
| Warn | 出乎意料的事情;应用程序将继续 |
| Info | 正常行为,例如发送的邮件、用户更新的个人资料等 |
| Debug | 用于调试;执行查询,用户认证,会话过期 |
| Trace | 用于跟踪调试;开始方法 X,结束方法 X |
name– 匹配记录器对象的记录器名称 - 可能包含通配符(* 和?)minlevel–记录的最低级别maxlevel– 记录的最高级别level–单级记录levels- 以逗号分隔的要记录的级别列表writeTo– 逗号分隔的要写入的目标列表final–最终规则匹配后不处理任何规则enabled- 设置为false禁用规则而不删除它ruleName- 允许使用和进行规则查找的规则标识符Configuration.RemoveRuleByName。在 NLog 4.6.4 中引入finalMinLevel- 匹配的记录器将被限制为以下规则的指定最低级别。
📙 variable节点
NLog 配置变量允许您通过减少重复文本来简化配置。变量可用于为常用(或长而复杂)的 NLog 布局提供人名。这使得组织和构建 NLog 配置变得更加容易。
<!--声明节点-->
<variable name="logDirectory" value="logs/${shortdate}" />
<!--使用节点-->
<target name="file1" xsi:type="File" fileName="${logDirectory}/file1.txt"/>
总结:
首先配置变量,用以分类存储日志,比如说根据时间日期,或者日志等级等
level配置targets节点,声明要存的文件位置,消息格式化类型等等。
<target xsi:type="File" name="testfile" fileName="${logDirectory}/nlog-test-${shortdate}.log" layout="${longdate}|${logger}|${uppercase:${level}}|${message:exceptionSeparator=\r\n:withException=true} ${exception:format=Type,Message,Method,StackTrace}" encoding="utf-8"/>配置rules,根据不同的规则写入不同的target,
📓 比如说过滤Microsoft相关的日志,
<!-- MicroSoft相关的日志直接丢进黑洞里 并且因为final的原因,不会向下匹配规则--> <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />📓比如说通过消息内包含test输入test.log中,
<logger name="*" minlevel="Info" writeTo="testfile" final="true"> <filters defaultAction="Ignore"> <when condition="equals(message ,'test')" action="Log"/> </filters> </logger>
本文档详细介绍了NLog的使用,包括从NuGet安装,配置文件的设置,如变量、目标和规则的定义。NLog配置允许指定日志输出的文件,格式和过滤规则。例如,可以通过规则过滤掉Microsoft相关的日志,或者根据日志内容写入不同文件。配置变量可以简化日志目录管理,目标节点定义了日志写入文件及其布局,而rules节点则设置了日志级别和过滤条件,控制日志写入不同的目标。
1762

被折叠的 条评论
为什么被折叠?



