拥有不同配置的 NLog 记录器

Posted

技术标签:

【中文标题】拥有不同配置的 NLog 记录器【英文标题】:Having NLog loggers with different configuration 【发布时间】:2011-10-07 03:24:49 【问题描述】:

在 NLog 中可以创建多个具有不同配置的记录器吗?

我有一个组件,每次实例化时都必须将所有事件记录到与新实例相关的不同文件中。

NLog 可以做到这一点吗?如果没有,是否有日志框架可以做到这一点?

【问题讨论】:

【参考方案1】:

是的,你可以这样做。您可以为该类型配置记录器以记录到特定目标。或者,您可以配置该类型的记录器以记录到目标(例如文件),根据记录器名称(自动)命名文件。

有关一些示例,请参阅NLog config file documentation here。

另外,请参阅我的post here 了解一些配置文件提示。

这是一个非常简短的示例,说明如何配置两个记录器:一个用于将特定类型记录到以该类型命名的输出文件,另一个用于所有其他记录器以基于日期记录到文件。

<nlog>
  <targets> 
    <target name="f1" xsi:type="File" fileName="$logger.txt" />
    <target name="f2" xsi:type="File" fileName="$shortdate.txt" />
  </targets>
  <rules>
    <logger name="Name.Space.Class1" minlevel="Trace" writeTo="f1" />  
    <logger name="*" levels="Debug" writeTo="f2" />
  </rules>
</nlog>

如果您希望将 Name.Space.Class1 类型的日志转到“特殊”文件(即名称由记录器确定的文件),则可以将“最终”添加到记录器规范中,如下所示:

<logger name="Name.Space.Class1" minlevel="Trace"final="true" />

【讨论】:

【参考方案2】:

我的 NLog.config 完整示例

<?xml version="1.0"?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" throwExceptions="false" internalLogFile="\\YOURSERVNAME\Logs\nlog-internal.log" internalLogLevel="Warn">
  <variable name="basedir" value="$basedir/Logs"></variable>
  <targets>
    <default-target-parameters xsi:type="File" fileName="$var:basedir/Trace.csv" archiveFileName="$var:basedir/Archives/Trace/Trace.##.csv" archiveNumbering="DateAndSequence" archiveDateFormat="yyyy-MM-dd" archiveEvery="Month" maxArchiveFiles="15" archiveAboveSize="10485760" keepFileOpen="false"/>
    <default-wrapper xsi:type="BufferingWrapper" bufferSize="500" flushTimeout="10000" />
    <target name="TraceLog" xsi:type="File">
      <layout xsi:type="CsvLayout" delimiter="Semicolon">
        <column name="Time" layout="$longdate" />
        <column name="Callsite" layout="$callsite" />
        <column name="Level" layout="$level" />
        <column name="User" layout="$Identity" />
        <column name="Message" layout="$message" />
      </layout>
    </target>
    <target name="ErrorLog" xsi:type="File" fileName="$var:basedir/Errors.csv"  archiveFileName="$var:basedir/Archives/Errors/Errors.##.csv" maxArchiveFiles="10">
      <layout xsi:type="CsvLayout" delimiter="Semicolon">
        <column name="Time" layout="$longdate" />
        <column name="Callsite" layout="$callsite" />
        <column name="Level" layout="$level" />
        <column name="User" layout="$Identity" />
        <column name="Message" layout="$message" />
      </layout>
    </target>
  </targets>
  <rules>
    <logger name="*" minlevel="Trace" writeTo="TraceLog" />
    <logger name="*" minlevel="Error" writeTo="ErrorLog" />
  </rules>
</nlog>

【讨论】:

如何显式写入特定的 TARGET / LOGGER ?如果一个方法抛出错误我想写入 f1,如果另一个方法(文件操作)抛出错误写入 f2? 您需要打开您想要的特定记录器,即您希望能够写入该记录器的任何代码。例如,如果您的 NLog.config 规则部分定义了 name="f1" 和另一个 name="f2" 的记录器,那么您想要写入 f1 的代码将执行类似 Logger f2Log = LogManager.GetLogger("f2" );

以上是关于拥有不同配置的 NLog 记录器的主要内容,如果未能解决你的问题,请参考以下文章

使用 anotar catel nlog 日志记录时无法过滤类名(在 NLog.config 中)

Net Core 2.1 日志记录框架NLog+Mysql配置

NLog 缺少带有异步翻转文件配置的日志条目

.NET Core使用Nlog记录日志

C# 使用NLog记录日志

封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil