2015-07-10 89 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);