2013-11-27 1 views
2

У меня есть два задания таймера SharePoint, которые существуют в одном и том же процессе одновременно. Работы не имеют ничего общего друг с другом и не разделяют конфигурацию NLog. Однако они имеют тенденцию пересекаться друг с другом конфигурациями, регистрируясь в файле других.Несколько приложений в одном процессе с использованием NLog с разными целями

Вся конфигурация выполняется по коду. Цели называются и имя журнала. И я обязательно получаю ссылку на текущий LogManager.Configuration и перезагружаю его.

конфигурации в первой работы таймера:

if (LogManager.Configuration == null) 
{ 
    LogManager.Configuration = new LoggingConfiguration(); 
} 

var fileTarget = new FileTarget(); 
LogManager.Configuration.AddTarget("file", fileTarget); 

fileTarget.Encoding = Encoding.UTF8; 
fileTarget.FileName = "C:/OTDPLog/Log-{0}.txt"._Format(DateTime.Now.ToString("dd-MM-yyyy_hhmmss")); 
fileTarget.Layout = "${date:format=HH\\:mm\\:ss} ${logger} ${event-context:item=Dev} [${level:uppercase=true}]\t${message}. ${exception:format=ToString,StackTrace}"; 

var async = new AsyncTargetWrapper(fileTarget, 5000, AsyncTargetWrapperOverflowAction.Block); 
var rule = new LoggingRule("OTDP", LogLevel.Debug, async); 
LogManager.Configuration.LoggingRules.Add(rule); 

LogManager.Configuration.Reload(); 

Использование:

var logger = LogManager.GetLogger("OTDP"); 

logger.Info("bla bla bla"); 

Конфигурация для другой работы:

if (LogManager.Configuration == null) 
{ 
    LogManager.Configuration = new LoggingConfiguration(); 
} 

var fileTarget = new FileTarget(); 
LogManager.Configuration.AddTarget("file", fileTarget); 

fileTarget.Encoding = Encoding.UTF8; 
fileTarget.FileName = "C:/WikiLog/Log-{0}.txt"._Format(DateTime.Now.ToString("dd-MM-yyyy_hhmmss")); 
fileTarget.Layout = "${date:format=HH\\:mm\\:ss} ${logger} ${event-context:item=Dev} [${level:uppercase=true}]\t${message}. ${exception:format=ToString,StackTrace}"; 

var async = new AsyncTargetWrapper(fileTarget, 5000, AsyncTargetWrapperOverflowAction.Block); 
var rule = new LoggingRule("Wiki", LogLevel.Debug, async); 
LogManager.Configuration.LoggingRules.Add(rule); 

LogManager.Configuration.Reload(); 

Использование:

var logger = LogManager.GetLogger("Wiki"); 
logger.Info("bla bla bla"); 

Как настроить регистраторы для разных приложений в одном и том же процессе?

+0

Что вы подразумеваете под «склонностью к перекрытию»? Это иногда случается, а иногда нет? Может быть, некоторая ошибка в коде, которая получает неправильный журнал? –

ответ

5

Итак, я наконец нашел решение. Во-первых, это невозможно при настройке NLog для работы непосредственно на LogManager.Configuration, мне нужно было получить ссылку, выполнить мою работу над этой ссылкой и, наконец, установить LogManager.Configuration. Во-вторых, мне пришлось переименовать цели, для которых они оба были названы «файл», и у них были разные имена.

if (LogManager.Configuration == null) 
{ 
    LogManager.Configuration = new LoggingConfiguration(); 
} 

var config = LogManager.Configuration; 

// Do my stuff, add targets and rules... 

LogManager.Configuration = config;