log4net: How to set logger file name dynamically?
dynamic, filenames, log4net
Solution
What about to use "%property" to define a dynamic 'tag' to the file name (at runtime) ?
<file type="log4net.Util.PatternString" value="~/App_Data/%property{LogName}" />
Explained here: Best way to dynamically set an appender file path
Problem
This is a really common question, but I have not been able to get an answer to work. Here is my configuration file: ``` <?xml version="1.0" encoding="utf-8"?> <log4net> <appender name="RollingFile" type="log4net.Appender.RollingFileAppender"> <file value="CraneUserInterface.log" /> <appendToFile value="true" /> <maxSizeRollBackups value="90" /> <rollingStyle value="Size" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date - %message%newline" /> </layout> </appender> <root> <level value="DEBUG" /> <appender-ref ref="RollingFile" /> </root> ``` But I need to determine the actual logging file name at run time. I found a nice example here, but when I try to loop through the collection returned by the call to GetIterators(), I find that that collection is empty. I need to change the name "CraneUserInterface.log" to "CraneUserInterface_1.log", or 2, or 3, depending on something the program reads at run time. How can I do that? Here's my first pass at using the code presented in that sample: ``` static bool ChangeLogFileName(string AppenderName, string NewFilename) { // log4net.Repository.ILoggerRepository RootRep; // RootRep = log4net.LogManager.GetRepository(); log4net.Repository.ILoggerRepository RootRep = m_logger.Logger.Repository; foreach (log4net.Appender.IAppender iApp in RootRep.GetAppenders()) { string appenderName = iApp.Name; if (iApp.Name.CompareTo(AppenderName) == 0 && iApp is log4net.Appender.FileAppender) { log4net.Appender.FileAppender fApp = (log4net.Appender.FileAppender)iApp; fApp.File = NewFilename; fApp.ActivateOptions(); return true; // Appender found and name changed to NewFilename } } return false; // appender not found } ``` Thanks very much!