7

log4net を使用してアプリにログインしています。私の FileAppender は正常に動作していますが、MemoryAppender に問題があります。

ここに私の設定ファイルがあります。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
    </configSections>
<log4net>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
  <param name="File" value="Envision.log" />
  <param name="AppendToFile" value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <param name="Header" value="" />
    <param name="Footer" value="" />
    <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
  </layout>
</appender>
<appender name="MemoryAppender" type="log4net.Appender.MemoryAppender">

</appender>
<root>
  <level value="ALL" />
  <appender-ref ref="LogFileAppender" />
  <appender-ref ref="MemoryAppender" />
</root>
</log4net>
</configuration>

このコードを使用して、構成ファイルをセットアップします。

FileInfo file = new FileInfo(configPath);
log4net.Config.XmlConfigurator.Configure(file);
file = null;

私が言ったように、FileAppender はうまく機能します。しかし、私はイベントを取得できないようです。私はこのようなものを使ってMemoryAppenderを取得しようとしました。

Hierarchy hierarchy = LogManager.GetRepository() as Hierarchy;
MemoryAppender mappender = hierarchy.Root.GetAppender("MemoryAppender") as MemoryAppender;

私は使用してみました:

var events = mappender.GetEvents()

何かを記録した後、イベントは常に空です。構成ファイルを使用する代わりに、コードで FileAppender と MemoryAppender を設定しようとしましたが、FileAppender は正常に動作しますが、MemoryAppender からイベントを取得できないようです。私が MemoryAppender を正しく理解しているかどうか知りたいですか? また、GetEvents が空でないことを確認するループ スレッドを設定しようとしましたが、ログを記録している間は常に空に戻ります。MemoryAppender で Threshold を Core.Level.All に設定しようとしましたが、何も変わりませんでした。

方向性をありがとう。私は周りを見回しましたが、私が見たサイトからは、私が何をしているのかわかりません。

これほど単純なものでも機能しません。イベントの長さは常にゼロです。

public partial class MainWindow : Window {
    public MainWindow() {
        InitializeComponent();

        MemoryAppender appender = new MemoryAppender();
        ILog logger = LogManager.GetLogger("foo");
        BasicConfigurator.Configure(appender);

        logger.Error("Should work");
        var events = appender.GetEvents();
    }
}
4

5 に答える 5

11

それが必要な人のために、C# でプログラムによって行う方法を次に示します。

var memoryAppender = new MemoryAppender();
var repository = (log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository();
repository.Root.AddAppender(memoryAppender);
var events = memoryAppender.GetEvents();
于 2012-09-10T14:46:26.400 に答える
1

あなたが投稿した簡単なサンプル コードは、log4net 1.2.10.0 を使用して問題なく動作します。

ソースをダウンロードして、デバッガーでステップ実行することをお勧めします。最初は少し難しそうに見えるかもしれませんが、すぐにコードに慣れるので、理解するのは難しくありません。カスタム制約とアペンダーで問題が発生したときに、これを何度も行いました。問題を迅速に解決するのに本当に役立ち、log4net がどのように機能するかをよりよく理解できます。

于 2011-04-10T04:04:27.583 に答える
1

私はそれを考え出した。誤って Compact Framework .dll を使用していました。.net 2.0 バージョンに切り替えたために、log4net 名前空間が見つからないという問題が発生したことに気付いたので、それを検索して、.net Framework 4 クライアント プロファイルを .net Framework 4 に変更する必要があることに気付きました。私は今、期待どおりにイベントを取得しています。

于 2011-04-11T01:52:15.790 に答える