2015-07-10 1 views
1

Мне нужно написать журнал событий для каждого экземпляра класса для разделения файла. Исторически проект использует NLog для регистрации, поэтому я хочу, чтобы попытаться решения этого вопроса с помощью NLog (я нашел подобную тему Unique log file for each instance of class, но предлагает использовать log4net)Отдельный файл журнала для конкретного экземпляра класса с использованием NLog

В настоящее время я получаю экземпляр регистратору, как это:

public static Logger GetInstanceLogger(string name, bool init = false) 
    { 
     if (!LogManager.Configuration.AllTargets.Any(t => t.Name == name)) 
     { 
      var target = new FileTarget(); 

       target.Name = name; 
       target.FileName = string.Format("logs/{0}.${{shortdate}}.log", name); 

      target.Layout = 
      "${date:format=dd.MM.yyyy HH\\:mm\\:ss.fff} thread[${threadid}] ${logger} (${level:uppercase=true}): ${message}. ${exception:format=ToString}"; 
      var config = init ? new LoggingConfiguration() : LogManager.Configuration; 
      config.AddTarget(name, target); 

      var ruleInfo = new LoggingRule("*", LogLevel.Trace, target); 

      config.LoggingRules.Add(ruleInfo); 

      LogManager.Configuration = config; 

      LogManager.ReconfigExistingLoggers(); 
     } 

     var logger = LogManager.GetLogger(name); 

     return logger; 
    } 

Сейчас он записывает один и тот же журнал во все файлы (я полагаю, это вызвано уровнем журнала). Есть ли способ выполнить эту задачу с помощью NLog?

Спасибо.

ответ

3

Я пришел с решением, используя свойства события рендеринга макета в имени файла. Когда я пишу новое сообщение, чтобы войти, я добавляю имя файла как свойство для LogEventInfo

protected virtual void SendEvent(LogLevel level, string message, Exception exception, string memberName = null) 
    { 
     var logEvent = new LogEventInfo(level, _name, message); 
     logEvent.Exception = exception; 
     foreach (String key in _properties.Keys) 
     { 
      logEvent.Properties[key] = _properties[key]; 
     } 
     _logger.Log(logEvent); 
    } 

И в конфигурационном файле в NLog цели раздела:

<targets async="true"> 
    <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}_${event-properties:item=Name}.log" 
      layout="${detailedLayout}" /> 
    <target xsi:type="File" name="errorLogFile" fileName="${basedir}/logs/${shortdate}.ERROR_${event-properties:item=Name}.log" 
     layout="${detailedLayout}" /> 
</targets> 
-1
try var ruleInfo = new LoggingRule(name, LogLevel.Trace, target);