2016-11-26 7 views
1

У меня есть следующий класс:Как войти в двух разных файлов с помощью NLog

private string name; 
private Logger logger; 
private LogLevel lvl; 
private LoggingConfiguration config; 

public Logger(string name, string path, string format, LogLevel lvl) 
{ 
    this.name = name; 

    FileTarget fileTarget = new FileTarget(); 
    fileTarget.FileName = path; 
    fileTarget.Layout = format; 

    this.lvl = lvl; 
    LoggingRule rule = new LoggingRule(name, lvl, fileTarget); 

    config = new LoggingConfiguration(); 
    config.AddTarget(name, fileTarget); 
    config.LoggingRules.Add(rule); 

    LogManager.Configuration = config; 

    logger = LogManager.GetLogger(this.name); 
    logger.Trace("test"); 
} 

я создаю две разные регистраторы, как это:

Logger("log1", "c:\\test\\log1.txt", ${message}, LogLevel.Debug); 
Logger("log2", "c:\\test\\log2.txt", ${message}, LogLevel.Debug); 

Оба файла создаются с помощью теста строки. Но когда я пытаюсь зарегистрировать сообщение с (метод класса):

public void Log(string msg) 
{ 
    logger = NLog.LogManager.GetLogger(name); 
    //LogManager.Configuration = config; 
    //LogManager.Configuration.Reload(); 
    logger.Log(lvl, msg); 
} 

Сообщение зарегистрировано только во втором файле. Что я делаю не так?

+0

Вы используете то же имя файла для обоих регистраторов в коде выше. – Striezel

+0

Это была ошибка в типографии, извините, я изменил пути, которые использовал и не проверял перед публикацией здесь. Во всяком случае, отредактировал сообщение. Спасибо. – alface

ответ

2

Я не совсем уверен, но, насколько я помню, LogManager.Configuration является своего рода глобальным и используется для всех созданных после этого регистраторов. Таким образом, второй вызов вашей функции Logger() перезаписывает параметры конфигурации, которые вы сделали во время первого вызова. Вот почему ведение журнала происходит только в более позднем файле.

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

Так основной подход (без отдельной функции) должна выглядеть примерно так: (Внимание: Код не был проверен, поэтому скопируйте & пасту на свой страх и риск)

FileTarget fileTarget1 = new FileTarget(); 
fileTarget1.FileName = "C:\\foo\\bar1.txt"; 
fileTarget1.Layout = "${message}"; 

FileTarget fileTarget2 = new FileTarget(); 
fileTarget2.FileName = "C:\\foo\\bar2.txt"; 
fileTarget2.Layout = "${message}"; 

LoggingRule rule1 = new LoggingRule("log1", LogLevel.Debug, fileTarget1); 
LoggingRule rule2 = new LoggingRule("log2", LogLevel.Debug, fileTarget2); 

config = new LoggingConfiguration(); 
config.AddTarget("log1", fileTarget1); 
config.LoggingRules.Add(rule1); 
config.AddTarget("log2", fileTarget2); 
config.LoggingRules.Add(rule2); 

LogManager.Configuration = config; 

logger = LogManager.GetLogger(this.name); 
logger.Trace("test"); 

Я буду оставьте детали того, как поместить это в какую-либо функцию/метод многократного использования в качестве упражнения для читателя. ;)

+1

Да 'LogManager.Configuration' является' static', поэтому конфигурация является общей и глобальной. – Julian

+0

@Julian: Спасибо за разъяснение. – Striezel

+0

Для опытных пользователей существует также возможность работать с несколькими конфигурациями, но не рекомендуется, если это не понадобится. – Julian

1

В дополнении,

Вы можете создать два loggingrules, но другой вариант заключается в использовании 1 LoggingRule и сделать путь_к_файл зависит от loggername.

например.

FileTarget fileTarget = new FileTarget(); 
fileTarget.FileName = "${basedir}/${logger}.log"; 
fileTarget.Layout = "${message}"; 

LoggingRule rule1 = new LoggingRule("*", LogLevel.Debug, fileTarget); 

var config = new LoggingConfiguration(); 
config.AddTarget("log1", fileTarget); 
config.LoggingRules.Add(rule1); 

LogManager.Configuration = config; 

var logger1 = LogManager.GetLogger("logger1"); 
logger.Trace("im logger1 to logger1.log"); 


var logger2 = LogManager.GetLogger("logger2"); 
logger.Trace("im logger2 and going to logger2.log"); 

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

  • Нет связанных вопросов^_^