代码之家  ›  专栏  ›  技术社区  ›  Ruben Bartelink

log4net初始化

  •  27
  • Ruben Bartelink  · 技术社区  · 16 年前

    我一直在努力寻找副本,但必须问以下问题,不管它看起来多么基础,一次又一次地把它弄清楚!

    在使用log4net版本1.2.10.0(在64位W7上的vs28ksp1上)的新控制台应用程序中,我有以下代码:

    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上运行,而没有添加assembly属性或调用main。有人能向我保证我没有想象到吗?
    2. 有人能给我指出在文档中,它明确指出需要配置部分和初始化钩子的地方吗?希望能解释一下什么时候更改了,如果是这样的话?

    我可以很容易地想象为什么这可能是一个策略——明确初始化步骤以避免意外等,只是我似乎回忆起这并不总是如此……(通常我将配置保存在单独的文件中,这通常会将配置从图片中删除)

    1 回复  |  直到 9 年前
        1
  •  28
  •   Mark Rushakoff    16 年前

    根据 the configuration page in the manual :

    log4net配置可以使用程序集级属性配置,而不是通过编程方式指定。

    XML配置属性: log4net.Config.XmlConfiguratorAttribute 允许 XmlConfigurator 要使用以下属性配置:

    • 配置文件…
    • 配置文件扩展…

    如果未指定config file或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文件;事实上,它们指出您必须使用这两个属性中的一个,但不要说要完全删除该属性,这向我暗示了该属性(或程序调用)需要以您想要的方式使用app.config。