13

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

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

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

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

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

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

ここで、別の構成ファイル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");

これは古いバージョンと同じように機能します。ログファイルのエントリが作成されますが、実行時にlog4net.configを変更すると、これらの変更は適用されません。「Watch = true」を使用すると、その機能が有効になります。

4

3 に答える 3

15

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)]
于 2011-10-19T18:58:54.700 に答える
10

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

System.Configuration APIは構成ファイルの再読み込みをサポートしていないため、log4net.Config.XmlConfigurator.ConfigureAndWatchメソッドを使用して構成設定を監視することはできません。

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

構成を読み取るファイルは、System.IO.FileInfoオブジェクトを受け入れる任意のlog4net.Config.XmlConfiguratorメソッドを使用して指定できます。ファイルシステムはファイル変更通知を監視できるため、ConfigureAndWatchメソッドを使用して、構成ファイルの変更を監視し、log4netを自動的に再構成できます。

于 2014-03-26T12:18:52.590 に答える
0

私はパーティーにひどく遅れていますが、これが私を助けてくれましたlog4net.LogManager.GetLogger("DUMMY");。プログラムの最初の段階での簡単な呼び出しです。program.csMain()メソッドの最初の行に配置しました。ロガーをオブジェクトに割り当てる必要はありません。ここに記載されているように、アセンブリの属性を読み取るためにlog4netに丁寧にリクエストするだけです。

属性を使用すると、アプリケーションの構成がどこからロードされるかを定義するためのより明確な方法になります。ただし、属性は純粋に受動的であることに注意してください。これらは情報提供のみです。したがって、構成属性を使用する場合は、log4netを呼び出して属性を読み取れるようにする必要があります。LogManager.GetLoggerを呼び出すだけで、呼び出し元のアセンブリの属性が読み取られて処理されます。したがって、アプリケーションの起動中、および外部アセンブリがロードされて呼び出される前に、できるだけ早くロギング呼び出しを行うことが不可欠です。

于 2018-01-23T13:21:40.920 に答える