When dynamically setting the log file name, the RollingFileAppender
used with the log4net.Appender.FileAppender+MinimalLock
locking model
does not seem to log anything to the file. However, when using the appender without this locking model, logging works.
In the config file below, Appender1
works, but Appender2
does not:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
</configSections>
<log4net>
<appender name="Appender2"
type="log4net.Appender.RollingFileAppender" >
<file type="log4net.Util.PatternString" value="%property{LogName}" />
<encoding value="utf-8" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10000KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%logger] %message%n" />
</layout>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
</appender>
<appender name="Appender1"
type="log4net.Appender.RollingFileAppender" >
<file type="log4net.Util.PatternString" value="%property{LogName}" />
<encoding value="utf-8" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10000KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message%n" />
</layout>
</appender>
<logger name="myLogger" additivity="false">
<level value="DEBUG" />
<appender-ref ref="Appender2" />
</logger>
<root>
<level value="DEBUG" />
<appender-ref ref="Appender1" />
</root>
</log4net>
</configuration>
Here is the sample code I am testing:
static void Main(string[] args)
{
ILog logger = LogManager.GetLogger("myLogger");
GlobalContext.Properties["LogName"] = "Log1.log"; // <== The log file name is getting set here.
log4net.Config.XmlConfigurator.Configure(new FileInfo(@"Logger.config"));
logger.Info("Sample log entry");
}
Another observation I made is that if I remove the root level logger, logging seems to work.
I think you have to add the
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
to both appenders, it is not present in Appender1. This will explain why removing the root element works.