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

Posted

技术标签:

【中文标题】Nlog - Web.config 规则 - 仅用于 Global.asax 文件的日志文件?【英文标题】:Nlog - Web.config rules - log file only for Global.asax file? 【发布时间】:2021-12-12 09:31:44 【问题描述】:

我正在尝试将一个额外的日志文件添加到我现有的 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() 的其他类中的现有日志有时会附加到诊断日志中(他们不应该这样做)。有没有办法配置它,这样就不会发生?

【问题讨论】:

【参考方案1】:

记录规则决定记录器输出应该写在哪里。您的日志记录规则说只有名称为 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")

要指定记录器名称diagnosticsfile 应该写入诊断文件目标,您可以这样做:

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

注意final="true" 以确保记录器输出不会流向写入file-target 的catch-all-rule。

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

另见:https://github.com/nlog/NLog/wiki/Configuration-file#rules

【讨论】:

谢谢,成功了!

以上是关于Nlog - Web.config 规则 - 仅用于 Global.asax 文件的日志文件?的主要内容,如果未能解决你的问题,请参考以下文章

从代码 C# 更改 Web.Config 中的 URL 重写规则

xml web.config中的IIS重写规则示例

web.config 重写规则在 blob 存储中的 Azure 静态网站中不起作用

将重写规则添加到 web.config 会导致 IIS 控制台中的错误

如何使 URL 重写与 web.Release.config 转换一起工作?

web.config将2个规则合并为1