如何高效利用.NET日志框架Nlog进行日志管理?

2026-03-30 10:481阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2122个文字,预计阅读时间需要9分钟。

如何高效利用.NET日志框架Nlog进行日志管理?

目录 + 快速安装 + 快速配置 + 快速使用 + 详细配置 + 添加支持Console输出 + 输出到CSV文件 + 配置日志大小 + 配置日志分级 + 配置生成规则 + 日志过滤器 + 条件语句 + 条件函数 + NLog是一个基于.NET平台编写的日志类。

目录
  • 快速安装
  • 快速配置
  • 快速使用
  • 详解配置
    • 添加支持Console输出
    • 输出至CSV文件
  • 配置日志大小
    • 配置日志分级
      • 配置生成规则
        • 日志过滤器
          • 条件语言
          • 条件函数

        NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码。

        NLog是一个简单灵活的.NET日志记录类库。通过使用NLog,我们可以在任何一种.NET语言中输出带有上下文的(contextual information)调试诊断信息,根据喜好配置其表现样式之后发送到一个或多个输出目标(target)中。

        快速安装

        在软件包管理器控制台中使用GUI或以下命令:

        1.安装Nlog

        Install-Package Nlog

        2.安装Nlog.Config

        Install-Package Nlog.Config

        快速配置

        打开目录中得Nlog.Config文件, 可以注意到, XML文件中有详细说明, rules区允许添加用户自定义得路由规则, targets则用于配置一些输出目标, 如下:

        <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="www.nlog-project.org/schemas/NLog.xsd NLog.xsd" autoReload="true" throwExceptions="false" internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log"> <!-- optional, add some variables github.com/nlog/NLog/wiki/Configuration-file#variables --> <variable name="myvar" value="myvalue"/> <!-- See github.com/nlog/nlog/wiki/Configuration-file for information on customizing logging rules and outputs. --> <targets> <!-- add your targets here See github.com/nlog/NLog/wiki/Targets for possible targets. See github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers. --> <!-- Write events to a file with the date in the filename. <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" /> --> </targets> <rules> <!-- add your logging rules here --> <!-- Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f" <logger name="*" minlevel="Debug" writeTo="f" /> --> </rules> </nlog>

        我们暂时把注释的说明代码移除, 还原到最简洁得XML格式, 如下:

        <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" > <targets> <!--这个目标:最终输出文件类型, 位于根目录中得logs文件夹中, 名称以每日得时间一次生成log文件 , layout: 这个选项为生成的格式--> <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" /> </targets> <rules> <!--设定了一个Debug得路由, 最终指向了一个f名称得目标 --> <logger name="*" minlevel="Debug" writeTo="f" /> </rules> </nlog>

        快速使用

        1.创建Nlog实例

        private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();

        2.使用Debug进行输出

        由于在Nlog.Config当中, 我们已经添加了Debug的最终输出目标, 所以我们尝试输出Debug的内容:

        class Program { private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger(); static void Main(string[] args) { Logger.Debug("我出现了意外!"); Console.ReadKey(); } }

        运行完成之后,可以在当前的输出目录中, 发生已经生成了一个logs的文件夹,并且生成了当前计算器日期的log文件 (这个规则在Nolog.Config当中可以进行配置), 如图所示:

        详解配置

        关于rules中, 我们可以添加多种路由规则, 并且指向多个目标, 如下所示:

        添加支持Console输出

        1.在rules中添加Info, writeTo指向一个Console的目标

        <targets> <!--<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" />--> <target xsi:type="Console" name="console"/> </targets> <rules> <!--<logger name="*" minlevel="Debug" writeTo="f" />--> <logger name="*" minlevel="Info" writeTo="console"/> </rules>

        2.使用Info输出

        输出至CSV文件

        1.在rules中添加一个新的路由, 以支持csv文件, 并且添加一个目标, 输出至csv文件, column可以用于指定每列生成的数据内容格式

        <targets> <target name="csv" xsi:type="File" fileName="${basedir}/file.csv"> <layout xsi:type="CSVLayout"> <column name="time" layout="${longdate}" /> <column name="message" layout="${message}" /> <column name="logger" layout="${logger}"/> <column name="level" layout="${level}"/> </layout> </target> </targets> <rules> <logger name="*" minlevel="Debug" writeTo="csv" /> </rules>

        最终调用Debug("xxxx"), 输出的效果如下:

        配置日志大小

        Nlog允许用户配置单个文件大小, 放置在内容过长效率过慢,配置了大小之后, Nlog会自动创建一个新的文件副本,插入新的日志输出。

        • maxArchiveFiles: 允许生成的副本文件最大数量
        • archiveAboveSize: 允许单个文件得最大容量
        • archiveEvery: 按天生成
        • layout: 当前得内容布局格式
        • fileName: 包含完整得生成文件得路径和文件名

        <targets> <target name="file" xsi:type="File" layout="${longdate} ${logger} ${message}${exception:format=ToString}" fileName="${basedir}/logs/logfile.txt" maxArchiveFiles="5" archiveAboveSize="10240" archiveEvery="Day" /> </targets> <rules> <logger name="*" minlevel="Debug" writeTo="file" /> </rules>

        配置日志分级

        单个文件目标可用于一次写入多个文件。以下配置将导致每个日志级别的日志条目被写入一个单独的文件,支持以下格式:

        Trace.log

        Debug.log

        Info.log

        Warn.log

        Error.log

        Fatal.log

        只需要在Nlog.Config中配置以下内容即可:

        <?xml version="1.0" ?> <nlog xmlns="www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="www.w3.org/2001/XMLSchema-instance"> <targets> <target name="file" xsi:type="File" layout="${longdate} ${logger} ${message}${exception:format=ToString}" fileName="${basedir}/${level}.log" /> </targets> <rules> <logger name="*" minlevel="Debug" writeTo="file" /> </rules> </nlog>

        配置生成规则

        只需要将filename中编写得固定名称修改程 ${shortdate} 即可

        <?xml version="1.0" ?> <nlog xmlns="www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="www.w3.org/2001/XMLSchema-instance"> <targets> <target name="file" xsi:type="File" layout="${longdate} ${logger} ${message}${exception:format=ToString}" fileName="${basedir}/${shortdate}.log" /> </targets> <rules> <logger name="*" minlevel="Debug" writeTo="file" /> </rules> </nlog>

        日志过滤器

        可以在路由当中, 为每个路由配置自定义得日志过滤器fliter, 如下所示, 演示了使用各种表达式来配置过滤器:

        <rules> <logger name="*" writeTo="file"> <filters> <when condition="length('${message}') > 100" action="Ignore" /> <when condition="equals('${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" /> </filters> </logger> </rules>

        条件语言

        过滤器表达式以特殊的迷你语言编写。该语言包括:

        关系运算符:==,!=,<,<=,>=和>

        注意:一些预先定义的XML字符可能需要转义。例如,如果尝试使用'<'字符,则XML解析器会将其解释为开始标记,这会导致配置文件中的错误。而是<在这种情况下使用转义版本的<<(())。

        布尔运算符:and,or,not

        始终被视为布局的字符串文字- ${somerenderer}

        布尔文字- true和false

        数值文字-例如12345(整数文字)和12345.678(浮点文字)

        日志级别文字- LogLevel.Trace,LogLevel.Debug,...LogLevel.Fatal

        预定义的关键字来访问最常用的日志事件属性- level,message和logger

        花括号-一起覆盖默认优先级和分组表达式

        条件函数-执行string和object测试

        单引号应与另一个单引号转义。

        如何高效利用.NET日志框架Nlog进行日志管理?

        条件函数

        以下条件功能可用:

        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')

        到此这篇关于.NET日志框架Nlog使用介绍的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持自由互联。

        本文共计2122个文字,预计阅读时间需要9分钟。

        如何高效利用.NET日志框架Nlog进行日志管理?

        目录 + 快速安装 + 快速配置 + 快速使用 + 详细配置 + 添加支持Console输出 + 输出到CSV文件 + 配置日志大小 + 配置日志分级 + 配置生成规则 + 日志过滤器 + 条件语句 + 条件函数 + NLog是一个基于.NET平台编写的日志类。

        目录
        • 快速安装
        • 快速配置
        • 快速使用
        • 详解配置
          • 添加支持Console输出
          • 输出至CSV文件
        • 配置日志大小
          • 配置日志分级
            • 配置生成规则
              • 日志过滤器
                • 条件语言
                • 条件函数

              NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码。

              NLog是一个简单灵活的.NET日志记录类库。通过使用NLog,我们可以在任何一种.NET语言中输出带有上下文的(contextual information)调试诊断信息,根据喜好配置其表现样式之后发送到一个或多个输出目标(target)中。

              快速安装

              在软件包管理器控制台中使用GUI或以下命令:

              1.安装Nlog

              Install-Package Nlog

              2.安装Nlog.Config

              Install-Package Nlog.Config

              快速配置

              打开目录中得Nlog.Config文件, 可以注意到, XML文件中有详细说明, rules区允许添加用户自定义得路由规则, targets则用于配置一些输出目标, 如下:

              <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="www.nlog-project.org/schemas/NLog.xsd NLog.xsd" autoReload="true" throwExceptions="false" internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log"> <!-- optional, add some variables github.com/nlog/NLog/wiki/Configuration-file#variables --> <variable name="myvar" value="myvalue"/> <!-- See github.com/nlog/nlog/wiki/Configuration-file for information on customizing logging rules and outputs. --> <targets> <!-- add your targets here See github.com/nlog/NLog/wiki/Targets for possible targets. See github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers. --> <!-- Write events to a file with the date in the filename. <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" /> --> </targets> <rules> <!-- add your logging rules here --> <!-- Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f" <logger name="*" minlevel="Debug" writeTo="f" /> --> </rules> </nlog>

              我们暂时把注释的说明代码移除, 还原到最简洁得XML格式, 如下:

              <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" > <targets> <!--这个目标:最终输出文件类型, 位于根目录中得logs文件夹中, 名称以每日得时间一次生成log文件 , layout: 这个选项为生成的格式--> <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" /> </targets> <rules> <!--设定了一个Debug得路由, 最终指向了一个f名称得目标 --> <logger name="*" minlevel="Debug" writeTo="f" /> </rules> </nlog>

              快速使用

              1.创建Nlog实例

              private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();

              2.使用Debug进行输出

              由于在Nlog.Config当中, 我们已经添加了Debug的最终输出目标, 所以我们尝试输出Debug的内容:

              class Program { private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger(); static void Main(string[] args) { Logger.Debug("我出现了意外!"); Console.ReadKey(); } }

              运行完成之后,可以在当前的输出目录中, 发生已经生成了一个logs的文件夹,并且生成了当前计算器日期的log文件 (这个规则在Nolog.Config当中可以进行配置), 如图所示:

              详解配置

              关于rules中, 我们可以添加多种路由规则, 并且指向多个目标, 如下所示:

              添加支持Console输出

              1.在rules中添加Info, writeTo指向一个Console的目标

              <targets> <!--<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" />--> <target xsi:type="Console" name="console"/> </targets> <rules> <!--<logger name="*" minlevel="Debug" writeTo="f" />--> <logger name="*" minlevel="Info" writeTo="console"/> </rules>

              2.使用Info输出

              输出至CSV文件

              1.在rules中添加一个新的路由, 以支持csv文件, 并且添加一个目标, 输出至csv文件, column可以用于指定每列生成的数据内容格式

              <targets> <target name="csv" xsi:type="File" fileName="${basedir}/file.csv"> <layout xsi:type="CSVLayout"> <column name="time" layout="${longdate}" /> <column name="message" layout="${message}" /> <column name="logger" layout="${logger}"/> <column name="level" layout="${level}"/> </layout> </target> </targets> <rules> <logger name="*" minlevel="Debug" writeTo="csv" /> </rules>

              最终调用Debug("xxxx"), 输出的效果如下:

              配置日志大小

              Nlog允许用户配置单个文件大小, 放置在内容过长效率过慢,配置了大小之后, Nlog会自动创建一个新的文件副本,插入新的日志输出。

              • maxArchiveFiles: 允许生成的副本文件最大数量
              • archiveAboveSize: 允许单个文件得最大容量
              • archiveEvery: 按天生成
              • layout: 当前得内容布局格式
              • fileName: 包含完整得生成文件得路径和文件名

              <targets> <target name="file" xsi:type="File" layout="${longdate} ${logger} ${message}${exception:format=ToString}" fileName="${basedir}/logs/logfile.txt" maxArchiveFiles="5" archiveAboveSize="10240" archiveEvery="Day" /> </targets> <rules> <logger name="*" minlevel="Debug" writeTo="file" /> </rules>

              配置日志分级

              单个文件目标可用于一次写入多个文件。以下配置将导致每个日志级别的日志条目被写入一个单独的文件,支持以下格式:

              Trace.log

              Debug.log

              Info.log

              Warn.log

              Error.log

              Fatal.log

              只需要在Nlog.Config中配置以下内容即可:

              <?xml version="1.0" ?> <nlog xmlns="www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="www.w3.org/2001/XMLSchema-instance"> <targets> <target name="file" xsi:type="File" layout="${longdate} ${logger} ${message}${exception:format=ToString}" fileName="${basedir}/${level}.log" /> </targets> <rules> <logger name="*" minlevel="Debug" writeTo="file" /> </rules> </nlog>

              配置生成规则

              只需要将filename中编写得固定名称修改程 ${shortdate} 即可

              <?xml version="1.0" ?> <nlog xmlns="www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="www.w3.org/2001/XMLSchema-instance"> <targets> <target name="file" xsi:type="File" layout="${longdate} ${logger} ${message}${exception:format=ToString}" fileName="${basedir}/${shortdate}.log" /> </targets> <rules> <logger name="*" minlevel="Debug" writeTo="file" /> </rules> </nlog>

              日志过滤器

              可以在路由当中, 为每个路由配置自定义得日志过滤器fliter, 如下所示, 演示了使用各种表达式来配置过滤器:

              <rules> <logger name="*" writeTo="file"> <filters> <when condition="length('${message}') > 100" action="Ignore" /> <when condition="equals('${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" /> </filters> </logger> </rules>

              条件语言

              过滤器表达式以特殊的迷你语言编写。该语言包括:

              关系运算符:==,!=,<,<=,>=和>

              注意:一些预先定义的XML字符可能需要转义。例如,如果尝试使用'<'字符,则XML解析器会将其解释为开始标记,这会导致配置文件中的错误。而是<在这种情况下使用转义版本的<<(())。

              布尔运算符:and,or,not

              始终被视为布局的字符串文字- ${somerenderer}

              布尔文字- true和false

              数值文字-例如12345(整数文字)和12345.678(浮点文字)

              日志级别文字- LogLevel.Trace,LogLevel.Debug,...LogLevel.Fatal

              预定义的关键字来访问最常用的日志事件属性- level,message和logger

              花括号-一起覆盖默认优先级和分组表达式

              条件函数-执行string和object测试

              单引号应与另一个单引号转义。

              如何高效利用.NET日志框架Nlog进行日志管理?

              条件函数

              以下条件功能可用:

              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')

              到此这篇关于.NET日志框架Nlog使用介绍的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持自由互联。