【问题标题】:NLog Custom LayoutRenderer not workingNLog 自定义 LayoutRenderer 不工作
【发布时间】:2013-02-07 14:36:51
【问题描述】:

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

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

对于我的一生,我无法理解发生了什么。

【问题讨论】:

  • 在 WCF 中,HttpContext.Current; 将始终为 null...所以builder.Append 不会被调用...来自MSDN:HttpContext:Current 是从 WCF 服务中访问时始终为空。请改用 RequestContext。
  • 我实际上已经解决了这个问题,但我会将您的评论标记为 MSDN 参考的答案,即 HttpContext 在 WCF 中始终为空。如果您愿意,请将您的答案添加为评论,以便我这样做。

标签: logging error-handling nlog


【解决方案1】:

您在项目中会得到不同的结果,因为在 WCF 中 HttpContext.Current 始终是 null...

来自MSDN

HttpContext:当从 WCF 服务中访问时,Current 始终为 null。请改用 RequestContext。

因为你的

if (context == null) {
    return;
} 

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多