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 out
I happen to have written an answer that fits your question as well.
In essence, instead of trying to rewrite the configuration, you'd be better off simply creating a configuration that allows you to dynamically choose the filename you want.
An adapted example for your use case:
Logger myLog = LogManager.GetLogger(name);
LogLevel level = LogLevel.Error;
string message = "This is an error message!";
You turn this information into a LogEventInfo
object:
LogEventInfo logEvent = new LogEventInfo(level , myLog.Name, message);
You can then add properties to this event (the string indexes are free to choose):
logEvent.Properties["CustomFileName"] = "mycustomfilename";
And then you write to the log:
myLog.Log(logEvent);
The interesting thing here is that in your NLog configuration, you can use this custom property in any field that the Nlog documentation refers to as a "Layout" value.
You use ${event-properties:item=CustomFileName}
in the layout to access the property. For example:
<target xsi:type="File"
name="file"
fileName="${basedir}/logs/${event-properties:item=CustomFileName}.log"
layout="${message}" />
Following the posted example, this message will be logged in the mycustomfilename.log
file. This enables you to dynamically switch your targeted file as you please by setting the logEvent.Properties["CustomFileName"]
value to whatever filename you want to use.
Note that you can further optimize this, and e.g. only be able to choose part of the file name.
The additional benefit is that you only need one target and one rule in your config file to make this work.