Nlog - Web.config 规则 - 仅用于 Global.asax 文件的日志文件?

Nlog - Web.config rules - log file only for Global.asax file?

我正在尝试向我现有的 NLog 实现添加一个额外的日志文件。 我已经有一个 Nlog 文件记录器,但我想为某些日志添加另一个。

我无法将这些日志分开,因为现有调用使用 LogManager.GetCurrentClassLogger() 并且它似乎只是附加到我想分开的日志上。

新日志文件只应由 Global.asax 文件中的日志填充,但将该规则集添加到 Web.config 不起作用。 Global.asax 文件有没有特殊的定义规则的方法?

Global.asax 文件

namespace TestOne.Browser
{
using System.Net;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using DataAnnotationsExtensions.ClientValidation;

using WebMatrix.WebData;

public class MvcApplication : HttpApplication
{
    protected void Application_EndRequest()
    {
        ...

        var logger = LogManager.GetLogger("diagnosticsfile");
        logger.Info("{0}, {1}, {2}, {3}", user, pageName, totalClientTimings, duration);

        ...
    }
}
}

Web.config 文件

<nlog>
    <variable name="root" value="C:/TestOne/Logs/Browser" />
    <targets>
      <target name="file" type="File" header="Starting logging..." footer="Stopping logging..." layout="${date:format=yyyy-MM-dd HH\:mm\:ss.fff} ${uppercase:${level}} ${callsite} ${aspnet-user-identity}${newline}${message} ${exception:format=ToString:maxInnerExceptionLevel=5}" fileName="${root}/Browser.log" archiveFileName="${root}/Archive/Browser.{##}.log" createDirs="true" archiveEvery="Day" archiveNumbering="Rolling" maxArchiveFiles="31" concurrentWrites="false" keepFileOpen="false" />
      <target name="diagnosticsfile" type="File" header="Time, LogType, User, PageName, TotalClientTimings, Duration (ms)" layout="${longdate},${level:uppercase=true},${message}" fileName="${root}/DiagnosticsLog.log" archiveFileName="${root}/Archive/Diagnostics.{##}.log" createDirs="true" archiveEvery="Day" archiveNumbering="Rolling" maxArchiveFiles="31" concurrentWrites="false" keepFileOpen="false" />
    </targets>
    <rules>
      <logger name="*" minlevel="Trace" writeTo="file" />
      <logger name="TestOne.Browser.MvcApplication" minlevel="Info" writeTo="diagnosticsfile" />
    </rules>
  </nlog>

使用当前配置,没有任何内容写入我的诊断文件(新日志文件)。 如果我在 Nlog 规则中将 TestOne.Browser.MvcApplication 替换为 *,则会写入文件,但其他 类 中使用 LogManager.GetCurrentClassLogger() 的现有日志有时会附加到诊断日志(他们不应该这样做)。有没有一种方法可以配置它,以免发生这种情况?

日志记录规则决定记录器输出应该写在哪里。您的日志记录规则说只有名称为 TestOne.Browser.MvcApplication 的记录器应该写入 diagnosticsfile-target:

    <rules>
      <logger name="*" minlevel="Trace" writeTo="file" />
      <logger name="TestOne.Browser.MvcApplication" minlevel="Info" writeTo="diagnosticsfile" />
    </rules>

但是在您的代码中您使用的是 LogManager.GetLogger("diagnosticsfile"):

要指定 logger-name diagnosticsfile 应该写入 diagnosticsfile-target,您可以这样做:

    <rules>
      <logger name="diagnosticsfile" minlevel="Info" writeTo="diagnosticsfile" final="true" />
      <logger name="*" minlevel="Trace" writeTo="file" />
    </rules>

注意 final="true" 以确保记录器输出不会流向写入 file-target.

的包罗万象的规则

另请参阅:https://github.com/NLog/NLog/wiki/Tutorial

另请参阅:https://github.com/nlog/NLog/wiki/Configuration-file#rules