2013-10-14 3 views
0

У меня возникла странная проблема с новейшей версией log4net 1.2.12 Мой файл журнала успешно создан без проблем, так или иначе (нулевой) файл всегда создается в тот же каталог файла Exe.log4net 1.2.12 Консольное приложение (null)

Это мой 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 Создается файл (null).

Я использую VS2012 и .net 4.0 Framework.

ответ

2

Вы, наверное, есть линия, как

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

в вашем AssemblyInfo.cs.

Это инициализируется log4net и создать (нулевой) логфайл, когда первый доступ длл log4net происходит, что в вашем примере, когда он выполняет линию

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

Это будет происходить до того, как Основной метод называется и перед установкой свойства Logfile.

+0

Это решило проблему. Благодаря! –

0

изменение Try

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

стать

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

Я пробовал с вашим предложением, но я испытал ту же проблему. –

1

Я подозреваю, что это потому, что вы получаете экземпляр ILog в статическом поле: что статическое поле будет создано до кода конфигурации запуска и имя файла журнала было установлено, следовательно, создание нулевого файла, так как LogFileName имеет значение NULL.

Затем, когда вы задаете имя файла журнала и вызываете Configure(), создается второй файл.