0
namespace Com.Foo
{
    public class Bar
    {

        private static readonly ILog log = LogManager.GetLogger(typeof(Bar));

        public void DoIt()
        {
            log.Info("Did it again!");
        }
    }
}

class Program
{
    private static readonly ILog log = LogManager.GetLogger(typeof(Program));
    static void Main(string[] args)
    {
        string sfile = @"C:\development\Framework\Logging\ConsoleApplication1\app.config";
        XmlConfigurator.Configure(new System.IO.FileInfo(sfile));
        log.Info("Entering application.");
        Bar bar = new Bar();
        bar.DoIt();
        log.Info("Exiting application.");

        Console.ReadLine();
    }


}

私のlog4net構成は次のようになります。

<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">

  <!-- A1 uses PatternLayout -->
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%-4timestamp [%thread] %-5level %logger %ndc - %message%newline" />
  </layout>
</appender>

<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
  <level value="DEBUG" />
  <appender-ref ref="A1" />
</root>


<!-- Print only messages of level WARN or above in the package Com.Foo -->
<logger name="Com.Foo">
  <level value="WARN" />
</logger>

アプリケーションの出力には、Com.Foo からのログがまだ表示されます

67 [10] INFO ConsoleApplication1.Program (null) - アプリケーションに入ります。

100 [10] INFO ConsoleApplication1.Com.Foo.Bar (null) - またやった!

100 [10] INFO ConsoleApplication1.Program (null) - アプリケーションを終了しています。

Com.Foo.Bar が WARN レベルで表示されないように設定するにはどうすればよいですか?

私は何が欠けていますか?

ありがとう

4

3 に答える 3

1

あなたが提供した設定はうまくいくはずです。

ロガーを作成すると、階層内のロガーCom.Foo.Barから設定が継承されます。logger は root logger からアペンダーを継承しますが、独自のレベルがあり、 に設定されています。したがって、ロガーを介してロギング イベントを書き込もうとすると、有効なレベルが階層から取得されます。これは、階層ツリーで最も近いロガーのレベルです (ルート ロガーには常にレベルがあります)。あなたの場合はそうなので、ロギングイベントはアペンダーに渡されません。Com.FooCom.FooWARNCom.Foo.BarWARN

あなたの設定はあなたが提供したものとは異なると思います。間違った設定ファイルを読んでいる可能性があります。次のコードを試してください (アプリ構成ファイルが使用されます)。

XmlConfigurator.Configure();

または(さらに良い)属性を介して構成を使用します:

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

アップデート

ロガーの取得を変更するtypeof(Bar)"Com.Foo"、Bar クラスの間違った名前空間が提供されました。舞台裏のlog4netはタイプの完全な名前をロガーの名前として取るためです。したがって、namespace Com.Fooすべてが機能するはずです。

于 2012-04-27T21:58:01.883 に答える
0

試す

<levelToMatch value="WARN" />
于 2012-04-28T19:02:14.217 に答える
0

私はそれを理解しました.. Foo.Bar クラスでロガーを適切に設定していませんでした。

次の行を更新します

private static readonly ILog log = LogManager.GetLogger(typeof(Bar));

次へ..

private static readonly ILog log = LogManager.GetLogger("Com.Foo");

そしてそれはうまくいきました。

于 2012-04-27T23:21:00.233 に答える