log4netは私のapp.configを視聴しません
-
27-10-2019 - |
質問
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への簡単な呼び出しにより、呼び出しアセンブリ上の属性が読み取られて処理されます。 したがって、アプリケーションの起動中に、そして確かに外部アセンブリがロードされ、呼び出される前に、できるだけ早くロギングコールを行うことが不可欠です.