質問

log4netを構成して、app.configファイルに加えられた変更を監視しました。

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

アプリを実行して構成ファイルで変更を変更すると、これらの変更はアプリを再起動するときにのみ有効になります。なぜこれができるのでしょうか?

log4netにapp.configの変更を監視するように指示する方法もありますか?お気に入り:

<appender name="FileAppender" type="log4net.Appender.FileAppender" >
    <watch value="true" />
</appender>

- - - - - - - 編集 - - - - - - -

別のconfig-file:log4net.configを使用しようとしました。
このように見えます:

<log4net>
  <appender name="FileAppender" type="log4net.Appender.FileAppender">
    <file value="c:\log.txt" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%d [%t] %-5p %c (line %L) -- %m%n" />
    </layout>
  </appender>
  <root>
    <appender-ref ref="FileAppender" />
  </root>
</log4net>

AssemblyInfo.csで次のことを書きました。

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

ファイルにログを記録するクラスは次のようになります。

ILog myLogger = LogManager.GetLogger(typeof(Form1));
myLogger.Debug("test");

これは古いバージョンのように機能します。 logfileエントリは作成されますが、ランタイム中にlog4net.configを変更すると、これらの変更は適用されません.... "watch = true"その機能を有効にする必要がありますか?

役に立ちましたか?

解決

ha!、私は同じ問題に遭遇し、ロギングが必要な単体テストを実行していました。
この行を追加することはそれを修正しました:

log4net.Config.XmlConfigurator.Configure();

私のapp.config:

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
        <file value="log.txt" />
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="10" />
        <maximumFileSize value="100KB" />
        <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="RollingFileAppender" />
    </root>
</log4net>

私もこれを持っています:

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

他のヒント

によると log4netドキュメント, 、Watch機能は、アプリケーション構成ファイル(app.config、web.config)では機能しません。

System.Figuration APIは構成ファイルのリロードをサポートしていないため、log4net.config.config.xmlconfigurator.configureandwatchメソッドを使用して構成設定を監視できません。

したがって、log4Net構成が再構成可能になる必要がある場合は、別のXMLファイルに配置する必要があり、アプリケーションにはファイルを読み取るのに十分な権限が必要です。

構成を読み取るファイルは、system.io.fileinfoオブジェクトを受け入れるlog4net.config.xmlconfiguratorメソッドを使用して指定できます。ファイルシステムをファイルの変更通知について監視できるため、ConfigureAndWatchメソッドを使用してConfigurationファイルを変更するために監視し、log4Netを自動的に再構成できます。

私はパーティーにひどく遅れていますが - ここに、何が私を助けたのか:簡単な電話 log4net.LogManager.GetLogger("DUMMY"); 私のプログラムの最初に。私はそれを最初の行に置きました Program.CS's 主要() 方法。任意のオブジェクトにロガーを割り当てる必要はありません。ただし、記載されているように、アセンブリの属性を読み取るためにlog4netに丁寧な要求だけです ここ.

属性を使用することは、アプリケーションの構成がロードされる場所を定義するためのより明確な方法です。ただし、属性は純粋に受動的であることは注目に値します。それらは情報のみです。したがって、構成属性を使用する場合は、属性を読み取るためにlog4Netを呼び出す必要があります。 logmanager.getLoggerへの簡単な呼び出しにより、呼び出しアセンブリ上の属性が読み取られて処理されます。 したがって、アプリケーションの起動中に、そして確かに外部アセンブリがロードされ、呼び出される前に、できるだけ早くロギングコールを行うことが不可欠です.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top