Question: In my application, I work on several thousand of document a day. I'd like, in some cases some logs, one log by document. Then I'd like for a specific target change the output filename (and only the filename) at runtime.

Around the web I found how to create a target by programming me I'd like just update a the filename by programming. I tried the code below. The error I receive is "LayoutRender cannot be found 'logDirectory'.

Any idea ?

Thanks,

```
var target = (FileTarget)LogManager.Configuration.FindTargetByName("logfile");
target.FileName = "${logDirectory}/file2.txt";

LoggingConfiguration config = new LoggingConfiguration();
var asyncFileTarget = new AsyncTargetWrapper(target);
config.AddTarget("logfile", asyncFileTarget);

LogManager.Configuration = config;

```

The config file is :

```
  <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <variable name="logDirectory" value="C:/MyLogs"/>
    <targets>
      <target name="logfile" xsi:type="File" layout="${date:format=dd/MM/yyyy HH\:mm\:ss.fff}|${level}|${stacktrace}|${message}" fileName="${logDirectory}/file.txt" />
    </targets>

    <rules>
      <logger name="*" minlevel="Info" writeTo="logfile" />
    </rules>    
  </nlog>

```

Answer: 
Try `ReconfigExistingLoggers` method:

```
var target = (FileTarget)LogManager.Configuration.FindTargetByName("logfile");
target.FileName = "${logDirectory}/file2.txt";
LogManager.ReconfigExistingLoggers();

```

As written in docs:

> 
> Loops through all loggers previously returned by GetLogger. and
>  recalculates their target and filter list. Useful after modifying the
>  configuration programmatically to ensure that all loggers have been
>  properly configured.
> 
> 
> 

**EDIT**:

Try use custom layout renderer: [NLog config file to get configuration setting values from a web.config](https://stackoverflow.com/questions/7107499/nlog-config-file-to-get-configuration-setting-values-from-a-web-config)
If not needing to change the LogDirectory at runtime, then you can do this:

```
target.FileName = "${var:logDirectory}\\file2.txt");

```

If needing to modify the logDirectory at runtime, then use the GDC:

<https://github.com/NLog/NLog/wiki/Gdc-layout-renderer>

```
NLog.GlobalDiagnosticsContext.Set("logDirectory","C:\Temp\");

```

Then you can use the following layout:

```
target.FileName = "${gdc:item=logDirectory}\\file2.txt";

```