I have configured
log4net for out current project, a plain Windows Desktop application. I wanted log to rolling file into the
AppData\Local
folder. Not the Roaming folder, since log are specific to the machine and it is waste of resources to let them roam around. Also I wanted to see logs in console, but in DEBUG mode only, not in production.
First problem to find the
AppData\Local\MyAppName
has been solved by
log4net.Util.PatternString
class. It parses a special
%envFolderPath
and
%appdomain
patterns.
The second problem, to configure
ConsoleAppender
just in DEBUG mode has several solutions. It is possible to load different configs, or to configure
ConsoleAppender
programatically. I have decided to create own
DebugFilter
, which denies all log in production mode. This way I have just one log4net config file. The cons is that it is very slightly less efficient to have configured an Appender which denies all log, but it's OK for most of applications.
<log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="%envFolderPath{LocalApplicationData}\%appdomain\log.txt" />
<appendToFile value="true" />
<maxSizeRollBackups value="2" />
<maximumFileSize value="10MB" />
<rollingStyle value="Size" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
<filter type="cvtBackend.Logging.DebugFilter" />
</appender>
<!-- Setup the root category, add the appenders and set the default level -->
<root>
<level value="INFO" />
<appender-ref ref="RollingLogFileAppender" />
<appender-ref ref="ConsoleAppender" />
</root>
</log4net>
And the
DebugFilter
:
///
/// log4net filter which allows logging in DEBUG mode only.
///
public class DebugFilter : FilterSkeleton
{
public override FilterDecision Decide(LoggingEvent loggingEvent)
{
#if DEBUG
return FilterDecision.Neutral;
#else
return FilterDecision.Deny;
#endif
}
}