log4net 1.2.12 控制台应用程序(空)

本文关键字:应用程序 控制台 log4net | 更新日期: 2023-09-27 18:35:18

我在最新版本的log4net 1.2.12中遇到了一个奇怪的问题我的日志文件已成功创建,没有问题,无论如何,也始终在 Exe 文件的同一目录中创建一个(空)文件。

这是我的 xml 配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
    <appender name="Console" type="log4net.Appender.ConsoleAppender">
      <filter type="log4net.Filter.LevelMatchFilter">
        <levelToMatch value="DEBUG"/>
        <acceptOnMatch value="false"/>
      </filter>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%-5.5level] %logger - %message%newline"/>
      </layout>
    </appender>
    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
      <threshold value="ALL"/>
      <File type="log4net.Util.PatternString" value="%property{LogFileName}"/>
      <param name="appendToFile" value="false"/>
      <param name="maximumFileSize" value="20000KB"/>
      <param name="maxSizeRollBackups" value="200"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%-5.5level] %logger - %message%newline"/>
      </layout>
    </appender>
    <root>
      <level value="ALL"/>
      <appender-ref ref="RollingFile"/>
    </root>
  </log4net>
</configuration>

这就是我从我的主干部称呼它的方式:

class Program
{
    /// <summary>
    /// The logger
    /// </summary>
    private static ILog logger = LogManager.GetLogger(typeof(Program));
    /// <summary>
    /// The CMD line args
    /// </summary>
    public static Arguments CmdLineArgs = null;
    /// <summary>
    /// Main.
    /// </summary>
    /// <param name="args">The arguments.</param>
    /// <returns></returns>
    static int Main(string[] args)
    {
        try
        {
            CmdLineArgs = new Arguments();
            Parser CmdLineParser = new Parser();
            if (CmdLineParser.ParseArguments(args, CmdLineArgs))
            {
                log4net.GlobalContext.Properties["LogFileName"] = CmdLineArgs.LogFile;
                log4net.Config.XmlConfigurator.Configure();
                CmdLineArgs.PrintArguments(args);
                CmdLineArgs.Check();
                CmdLineArgs.PrintArguments();
            }
            else
            {
                CmdLineArgs.PrintArguments(args);
                Console.WriteLine(CmdLineArgs.GetUsage());
                Console.WriteLine(string.Format("Return Code: {0}", 2));
                return 2;
            }
            logger.Info("Execution Terminated");
            logger.Info(string.Format("Return Code: {0}", 0));
            return 0;
        }
        catch (Exception ex)
        {
            if (logger.IsInfoEnabled)
            {
                logger.Fatal("Fatal Error:", ex);
            }
            else
            {
                Console.WriteLine(ex.ToString());
                Console.WriteLine(string.Format("Return Code: {0}", 8));
            }
            logger.Info(string.Format("Return Code: {0}", 8));
            return 8;
        }
    }
}

这完全适用于 log4net 1.2.11 及更早版本,但在 log4net 1.2.12 中会创建一个(空)文件。

我正在使用VS2012和.net 4.0框架。

log4net 1.2.12 控制台应用程序(空)

你可能有一行像这样的行

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

在您的汇编信息.cs中。

这将初始化log4net并在第一次log4net dll访问发生时创建您的(空)日志文件,在您的示例中是当它执行该行时

private static ILog logger = LogManager.GetLogger(typeof(Program));

这将在调用 Main 方法之前和设置 Logfile 属性之前发生。

我怀疑这是因为您在静态字段中获得了ILog的实例:该静态字段将在配置代码运行并设置日志文件名之前创建,因此创建一个空文件,因为LogFileName为空。

然后,当您设置日志文件名并调用Configure()时,将创建第二个文件。

尝试更改

<File type="log4net.Util.PatternString" value="%property{LogFileName}"/>

成为

<param name="file" type="log4net.Util.PatternString" value="%property{LogFileName}"/>