2

一般的なアセンブリで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 Web サイトであり、最上位の Web サイトとして構成されています。

2 番目のプロジェクトは、IIS で複数のサービスをホストし、別の Web サイト (IIS の既定の Web サイト) で仮想ディレクトリとして構成された WCF プロジェクトです。

どちらも に次のものが含まれていますWeb.config

<appSettings>
  <add key="ErrorLogPath" value="D:\Logs" />
</appSettings>

どちらのプロジェクトも、共通のアセンブリ ( customer を含む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

2 番目のログは に表示されC:\Logger.Name\yyyy-MM-dd.logます。

どうしたの?構成と有効化コードは同じですが、ログは一貫して 2 つの異なる場所に表示されます。一方は意図したもので、もう一方は意図しないものです。

私の人生では、何が起こっているのか理解できません。

4

1 に答える 1

1

プロジェクトで異なる結果が得られるのは、WCF ではHttpContext.Current 常にnull...

MSDNから:

HttpContext: WCF サービス内からアクセスする場合、Current は常に null です。代わりに RequestContext を使用してください。

そしてあなたのせいで

if (context == null) {
    return;
} 

あなたのステートメントbuilder.Appendは呼び出されません...したがって、NLogはデフォルトで基本LayoutRenderer動作になります。

于 2013-02-28T08:33:39.233 に答える