2017-03-02 18 views
5

NLog kullanarak Windows Forms uygulamasının NET 4.5 (VS 2013) sürümü var.NLog'daki basedir değiştir Çalışma zamanındaki program hedefleri

<target name="asyncFileLog" xsi:type="AsyncWrapper"> 
    <target name="logfileTrace" xsi:type="File" fileName="${basedir}/logs/${shortdate}Trace.log" layout="${longdate} ${message}" lineEnding="Default"/> 
</target> 

<target name="asyncFileError" xsi:type="AsyncWrapper"> 
    <target name="logfileError" xsi:type="File" fileName="${basedir}/logs/${shortdate}Error.log" layout="${longdate} ${message} ${exception:format=tostring}" lineEnding="Default"/> 
</target> 

LogManager.Configuration.AllTargets.ToList(); döner 4 ürün değil, 2 öğe:

Hedef göründü.

var rutaLogs = ConfigurationManager.AppSettings["RutaLog"]; 
if (!Directory.Exists(rutaLogs)) return; 

var list = LogManager.Configuration.AllTargets.ToList(); 
foreach (var target in list) 
{ 
    FileTarget fileTarget = null; 
    var wrapperTarget = target as WrapperTargetBase; 

    // Unwrap the target if necessary. 
    if (wrapperTarget == null) 
    { 
     fileTarget = target as FileTarget; 
    } 
    else 
    { 
     fileTarget = wrapperTarget.WrappedTarget as FileTarget; 
     continue; 
    } 

    var value = fileTarget.FileName.ToString(); 
    value = value.Replace("${basedir}/logs/", rutaLogs); 
    fileTarget.FileName = value; 
} 

Değil şey oluşturur:

Ben

Bunu deneyin programlı çalışma zamanında yolu $ {basedir}/günlükleri değiştirmek istiyorum. LogManager.ReconfigExistingLoggers(); kullanmayı deneyin, ancak çalışmıyor.

Herhangi bir öneriniz var mı?

cevap

7

Bu durumda değişkenleri kullanmak daha kolaydır. Bu örnek için (${var:...})

:

<variable name="basedir" value="${basedir}" /> <!-- default, optional --> 

<targets> 
    <target name="asyncFileLog" xsi:type="AsyncWrapper"> 
    <target name="logfileTrace" xsi:type="File" 
      fileName="${var:basedir}/logs/${shortdate}Trace.log" 
      layout="${longdate} ${message}" lineEnding="Default"/> 
    </target> 
    ... 

LogManager.ReconfigExistingLoggers(); için C#

// create or edit 
LogManager.Configuration.Variables["basedir"] = "d:/mybasedir"; 

Gerek değişkeni değiştirme veya tüm hedefler üzerinde döngü!

Ayrıca bkz ${var} documentation

Güncelleme: senin .config dosyalarından okuduğunuz bu durumda, bu (! Hayır C# gerekli)

NLog.Extended kurun ve ${appsetting:name=..} kullanmak sadece NLog yapılandırmasıyla yapılabilirdi

örn.

fileName="${var:basedir}/logs/${appsetting:name=RutaLog}Trace.log" 

Ayrıca bkz ${appsetting} documentation

+1

'fileName = "$ {var: basedir}/günlükleri/$ {shortdate} Trace.log" seçeneğini kullanarak İşleri' ve 'fileName =" $ {appSetting'in kullanarak çalışıyor: adı = RutaLog} $ {shortdate} Trace.log "'. *** $ {appsetting: name = key} *** kullanımı daha nettir. – Kiquenet