我有一个自定义 LayoutRenderer
为 NLog
定义如下在一个共同的装配中:
[LayoutRenderer("appsettings")]
public class AppSettingsLayoutRenderer : LayoutRenderer {
[DefaultParameter]
public string Variable {
get;
set;
}
protected override void Append(StringBuilder builder, LogEventInfo logEvent) {
if (Variable == null) {
return;
}
var context = HttpContext.Current;
if (context == null) {
return;
}
builder.Append(Convert.ToString(ConfigurationManager.AppSettings[Variable], CultureInfo.InvariantCulture));
}
}
这个通用程序集在我实现日志记录的 2 个项目中被引用。
第一个项目是一个 ASP.NET/ASP.NET MVC 网站并配置为顶级网站。
第二个项目是一个 WCF 项目,在 IIS 下托管多个服务,并配置为另一个网站(IIS 中的默认网站)下的虚拟目录。
两者都在其
Web.config
中包含以下内容:<appSettings>
<add key="ErrorLogPath" value="D:\Logs" />
</appSettings>
这两个项目都引用了公共(public)程序集(其中包含客户
LayoutRenderer
)。我已验证 bin
这两个项目的文件夹实际上也包含程序集 DLL。我通过 IIS 中配置的路径确认了这一点。最后,两个项目都包含以下
NLog.config
Web.config
旁边的文件文件:<?xml version="1.0" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<extensions>
<add assembly="Collective.Core" />
</extensions>
<targets>
<target name="file" xsi:type="File" layout="${longdate}|${level:uppercase=true}|${logger}|${message}${onexception:inner=${newline}${exception:format=tostring}}" fileName="${appsettings:ErrorLogPath}\${logger}\${shortdate}.log" />
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="file" />
</rules>
</nlog>
两个项目都在同一个应用程序池下运行。
现在,我的问题:
对于第一个项目,日志出现在正确的位置,即
D:\Logs\Logger.Name\yyyy-MM-dd.log
.第二个,日志出现在
C:\Logger.Name\yyyy-MM-dd.log
.这是怎么回事?配置和启用代码是相同的,但日志始终出现在 2 个不同的位置,一个是有意的,另一个是无意的。
对于我的生活,我无法理解发生了什么。
最佳答案
您在项目中会得到不同的结果,因为在 WCF 中 HttpContext.Current
总是 null
...
来自 MSDN :
HttpContext: Current is always null when accessed from within a WCF service. Use RequestContext instead.
因为你的
if (context == null) {
return;
}
声明您的
builder.Append
不会被调用...所以 NLog 默认为基数 LayoutRenderer
行为。
关于logging - NLog 自定义 LayoutRenderer 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14753652/