我在一个通用程序集中为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:



而且因为你

if (context == null) {
    return;
}

声明不会调用您的builder.Append ...因此NLog默认为基本LayoutRenderer行为。

关于logging - NLog自定义LayoutRenderer无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14753652/

10-09 04:29