我有一个自定义LayoutRenderer
定义为一个共同的组件,用于NLog
如下:NLOG定制LayoutRenderer不工作
[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>
两个项目引用的共同组件(其中包含客户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
。
发生了什么事?配置和启用代码是相同的,但日志始终显示在两个不同的位置,一个是有意的,另一个是意外的。
对于我的生活,我不明白发生了什么事情。
在WCF中,'HttpContext.Current;'将总是** null ** ...所以'builder.Append'不会被调用...从[MSDN](http://msdn.microsoft .com/en-us/library/aa702682.aspx):HttpContext:当从WCF服务中访问时,Current始终为空。改用RequestContext。 – nemesv
我实际上已经排除了这个问题,但我会将你的评论标记为对于HttpContext上的MSDN引用的回答在WCF中始终为空。如果你喜欢,请添加你的答案作为评论,让我这样做。 –