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
:targe
t的名称属性,用来调用
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 layoutExamples:
${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>
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 | 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>