0

Я следую this example, чтобы программно настроить 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, и наоборот. Что не так в моей конфигурации?

ответ

2

Вы добавили оба регистратора файлов в регистратор root, что означает, что любые регистрирующие устройства, которые вы создаете, наследуют от этого.

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

Следует использовать тот факт, что 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 инструктирует регистратор не наследует appenders от его родителей, в этом случае корневая регистратор. Если вы удалите конфигурацию корневого журнала, это не требуется.

Смежные вопросы