Программная настройка log4net для записи в отдельные файлы журналов

Я следую этому примеру программно настроить log4net. Однако, поскольку я хочу регистрировать информацию отдельно и ошибки отдельно, я изменил метод настройки, как показано ниже.

public static void Setup()
{
    Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();

    PatternLayout patternLayout = new PatternLayout();
    patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline";
    patternLayout.ActivateOptions();

    RollingFileAppender info = new RollingFileAppender();
    info.AppendToFile = true;
    info.File = @"c:\Info\infolog.log";
    info.Layout = patternLayout;
    info.MaxSizeRollBackups = 5;
    info.MaximumFileSize = "1GB";
    info.RollingStyle = RollingFileAppender.RollingMode.Size;
    info.StaticLogFileName = true;
    info.ActivateOptions();
    info.Name = "info";



    RollingFileAppender error = new RollingFileAppender();
    error.AppendToFile = true;
    error.File = @"c:\Error\errorlog.log" ;
    error.Layout = patternLayout;
    error.MaxSizeRollBackups = 5;
    error.MaximumFileSize = "1GB";
    error.RollingStyle = RollingFileAppender.RollingMode.Size;
    error.StaticLogFileName = true;
    error.ActivateOptions();
    error.Name = "error";

    hierarchy.Root.AddAppender(info);
    hierarchy.Root.AddAppender(error);

    MemoryAppender memory = new MemoryAppender();
    memory.ActivateOptions();
    hierarchy.Root.AddAppender(memory);

    hierarchy.Root.Level = Level.Info;
    hierarchy.Configured = true;
}

и в моем коде я инициализировал его, как показано ниже

public class myclass
{
     ILog errorLog ;
     ILog infoLog ;
     public myclass()
     {
          errorLog = LogManager.GetLogger("error");
          infoLog = LogManager.GetLogger("info");       
     }


     public void LogMessage()
     {
         infoLog.Warn("warn message");
         errorLog.Error("Error message");
     }

}

Проблема заключается в том, что все, что я печатаю в infoLog, печатается как в файле infolog.log, так и в файле errorlog.log, и наоборот. Что не так в моей конфигурации?


person user20358    schedule 25.02.2015    source источник


Ответы (1)


Вы добавили оба файловых приложения к регистратору root, что означает, что любые создаваемые вами регистраторы наследуются от него.

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

Один из них — воспользоваться тем, что log4net кэширует логгеры: если вы создадите логгер и настроите его один раз, то при запросе логгера с тем же именем будет возвращен настроенный логгер.

Итак, в своем коде добавьте это после вызова hierarchy.Configured = true;:

ILog log = LogManager.GetLogger("error");
Logger logger = (Logger)log.Logger;
logger.Additivity = false;
logger.AddAppender(error); 

log = LogManager.GetLogger("info");
logger = (Logger)log.Logger;
logger.Additivity = false;
logger.AddAppender(info); 

Примечание: Additivity = false указывает регистратору не наследовать приложения от своего родителя, в данном случае корневого регистратора. Если вы удалите конфигурацию корневого регистратора, это не требуется.

person stuartd    schedule 25.02.2015