2013-02-07 28 views
1

我有一个自定义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

发生了什么事?配置和启用代码是相同的,但日志始终显示在两个不同的位置,一个是有意的,另一个是意外的。

对于我的生活,我不明白发生了什么事情。

+1

在WCF中,'HttpContext.Current;'将总是** null ** ...所以'builder.Append'不会被调用...从[MSDN](http://msdn.microsoft .com/en-us/library/aa702682.aspx):HttpContext:当从WCF服务中访问时,Current始终为空。改用RequestContext。 – nemesv

+0

我实际上已经排除了这个问题,但我会将你的评论标记为对于HttpContext上的MSDN引用的回答在WCF中始终为空。如果你喜欢,请添加你的答案作为评论,让我这样做。 –

回答

1

你因为在WCF得到您的项目不同的结果HttpContext.Current总是null ...

MSDN

的HttpContext:从WCF服务中进行访问时,电流总是空。改用RequestContext。

因为你builder.Append不会被调用......所以NLOG默认为基础LayoutRenderer行为您

if (context == null) { 
    return; 
} 

声明,。