10

I've configured a file target for NLog as follows:

<targets>
  <target name="asyncFile" xsi:type="AsyncWrapper">
    <target xsi:type="File" name="logfile" fileName="${basedir}/Logs/${shortdate}.log"
          layout="${longdate} ${uppercase:${level}} ${message}" />
  </target>    
</targets>

How can I query the actual filesystem path (fileName) of this File target via NLog's API?

aknuds1
  • 65,625
  • 67
  • 195
  • 317

3 Answers3

11
    private string GetLogFile()
    {
        var fileTarget = LogManager.Configuration.AllTargets.FirstOrDefault(t => t is FileTarget) as FileTarget;
        return fileTarget == null ? string.Empty : fileTarget.FileName.Render(new LogEventInfo { Level = LogLevel.Info });
    }
ZOS
  • 113
  • 1
  • 6
9

I've just tried to get this information via the configuration api.

enter image description here

Sadly it looks like the configuration is evaluated by the actual target and is not resolved in the configuration.

As {basedir} refers to the appdomain base directory you could simply read this value on your own.

var basedirPath = AppDomain.CurrentDomain.BaseDirectory;
ccellar
  • 10,326
  • 2
  • 38
  • 56
0

You could use nLog's api inside of code instead of an xml configuration file. Then, in your application, you assign the log's file path to a variable, and use that variable as the target's filename. You can access that variable, OR change it anytime you like (my snippet, here, is defined inside of a class).

Private MainNlogConfig As New LoggingConfiguration()
Dim localrule As New LoggingRule(*, LogLevel.Info, locallogtarget)
MainNlogConfig..AddTarget("file", locallogtarget)

With locallogtarget
    .Layout = "${longdate} ${logger} ${message}"
    .FileName = appdir & appName & ".log"  '----->LOOK HERE!
End With
LogManager.Configuration = MainNlogConfig
bgmCoder
  • 6,205
  • 8
  • 58
  • 105