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 重写规则
web.config 重写规则在 blob 存储中的 Azure 静态网站中不起作用
将重写规则添加到 web.config 会导致 IIS 控制台中的错误