2

log4net を使用するアセンブリがあります。このアセンブリを Windows フォーム アプリケーションとコンソール アプリケーションの両方に読み込みます。リリース ビルドとデバッグ ビルドの両方の Windows フォーム アプリ、およびデバッグ ビルドのコンソール アプリでは期待どおりに動作しますが、コンソール アプリのリリース ビルドでは不思議なことに失敗します。

私の AssemblyInfo.cs ファイルには次のものがあります。

[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension="log4net", Watch = true)]

ロギングを使用するクラスには、次のメンバー変数宣言を含めます。

private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

私の Library.dll.log4net 構成ファイルは次のようになります。

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>
  <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender" >
    <file value="Library.log" />
    <appendToFile value="true" />
    <rollingStyle value="Once" />
    <maxSizeRollBackups value="5" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>
  <root>
    <level value="INFO" />
    <appender-ref ref="ConsoleAppender" />
    <appender-ref ref="RollingFileAppender" />
  </root>
</log4net>

この記事( Log4Net はリリース モードでログを書き込まない - コンソール アプリケーション)の提案を試しましたが、役に立たないようです。

また、アセンブリで (参照される最初のオブジェクトのコンストラクターで) できるだけ早く内部デバッグをプログラムでオンにしようとしましたが、それも効果がありません。

他のアイデアはありますか?誰かが私が間違っていることを見つけることができますか?

4

1 に答える 1

7

アセンブリ構成属性のドキュメントに記載されているように:

したがって、構成属性を使用する場合は、log4net を呼び出して属性を読み取れるようにする必要があります。LogManager.GetLogger を単純に呼び出すと、呼び出し元のアセンブリの属性が読み取られて処理されます。したがって、アプリケーションの起動中はできるだけ早く、確実に外部アセンブリが読み込まれて呼び出される前に、ロギング呼び出しを行うことが不可欠です。

リリース ビルドではコンパイラが自由に再編成できるため、何かが最適化され、アセンブリ属性がすぐに反映されない可能性があります。

この場合、スタートアップ プログラムで単純な明示的なロギング呼び出しを行うと、log4net に構成が強制的に読み込まれます。

LogManager.GetLogger("Startup").Debug("This logging call loads the configuration");

ただし、一部の Web アプリや (コメントのように) スタートアップ アプリケーションが log4net を参照しない場合など、これでも問題が生じる可能性があります。これらの場合、アセンブリ属性の代わりに構成システムへの明示的な呼び出しを使用する必要があります。一度だけ呼び出す必要があります。

スタンドアロンの log4net 構成ファイルの場合:

XmlConfigurator.Configure(new FileInfo(path_to_config));

web.config または app.config の configSection の構成の場合

XmlConfigurator.Configure();
于 2016-04-02T13:25:53.950 に答える