29

私は重複を一生懸命探しましたが、それがどんなに基本的に見えるかもしれませんが、それを完全に明確にするために、次のことを尋ねなければなりません!

64 ビット W7 の VS28KSP1 で log4net バージョン 1.2.10.0 を使用する新しいコンソール アプリでは、次のコードがあります。

using log4net;
using log4net.Config;

namespace ConsoleApplication1
{
    class Program
    {
        static readonly ILog _log = LogManager.GetLogger(typeof(Program));
        static void Main(string[] args)
        {
            _log.Info("Ran");
        }
    }
}

app.configの には、次のものがあります。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="Program.log" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="1MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="[%username] %date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>

    <root>
      <level value="DEBUG" />
      <appender-ref ref="RollingFileAppender" />
    </root>
  </log4net>

</configuration>

属性を追加しない限り、これは何も書き込みません。

[ assembly:XmlConfigurator ]

または Main() で明示的に初期化します。

_log.Info("This will not go to the log");
XmlConfigurator.Configure();
_log.Info("Ran");

これにより、次の疑問が生じます。

  1. アセンブリ属性を追加したりメインで呼び出したりしなくても、log4net の一部のバージョンで動作しているのを見たことがあるとほぼ確信しています。誰かが私がそれを想像していないことを保証できますか?
  2. 誰かがドキュメントのどこに構成セクションと初期化フックの両方が必要であると明示的に述べているかを教えてもらえますか?

これがポリシーである理由を簡単に想像できます-驚きなどを避けるために初期化ステップを明示的にすることは、これが常にそうであるとは限らないことを思い出しているように見えるだけです...(そして通常、私は別のファイルに設定を持っています、通常、構成セクションを写真から取り除きます)

4

1 に答える 1

31

マニュアルの設定ページによると:

log4net 構成は、プログラムで指定するのではなく、アセンブリ レベルの属性を使用して構成できます。

XmlConfiguratorAttribute:次のプロパティを使用して構成できるようにしますlog4net.Config.XmlConfiguratorAttributeXmlConfigurator

  • 構成ファイル ...
  • ConfigFileExtension ...

ConfigFile または ConfigFileExtension プロパティのどちらも指定されていない場合、アプリケーション構成ファイル (TestApp.exe.config など) が log4net 構成ファイルとして使用されます。

使用例:

// Configure log4net using the .config file
[assembly: log4net.Config.XmlConfigurator(Watch=true)]
// This will cause log4net to look for a configuration file
// called TestApp.exe.config in the application base
// directory (i.e. the directory containing TestApp.exe)
// The config file will be watched for changes.
                        

少し曖昧だという点には同意しますが、使用例の存在は、log4net が上記の属性なしで .config ファイルを使用しないことを意味すると解釈します。そして、2 つのプロパティのいずれかを使用する必要があることを指摘しているが、属性を完全に除外することについて何も言わないという事実は、属性 (またはプログラムによる呼び出し) で app.config を使用する必要があることを示唆していますあなたが望む方法。

于 2009-08-11T16:19:05.870 に答える