Best practice to include log4Net external config file in ASP.NET
At startup, call:
XmlConfigurator.Configure();
In your Web.config, specify log4net.Config in appSettings:
<add key="log4net.Config" value="Log.config" />
This special setting allows you to change the log configuration without having to recompile. Especially helpful for moving between multiple environments.
Example
Consider the following project file structure:
\config\log4net\debug.config\config\log4net\staging.config\config\log4net\release.config\config\appSettings\debug.config\config\appSettings\staging.config\config\appSettings\release.config
Application and logging configurations are distinguished for each environment. References to the logging configurations are maintained in the application settings.
\config\appSettings\debug.config:
<appSettings> <add key="log4net.Config" value="config\log4net\debug.config" /> ...</appSettings>
\config\appSettings\staging.config:
<appSettings> <add key="log4net.Config" value="config\log4net\staging.config" /> ...</appSettings>
\config\appSettings\release.config:
<appSettings> <add key="log4net.Config" value="config\log4net\release.config" /> ...</appSettings>
Changing environments is a simple matter of updating the appSettings file in Web.config.
<appSettings file="config\appSettings\staging.config"> ...</appSettings>
I was dissatisfied with the "magic" configuration approach, because I wanted to specify my configuration in a path with an environment variable (%PUBLIC%\MyApp\MySettings.config).
So instead, I have this in my app.config:
<add key="MyLog4NetConfigFile" value="%PUBLIC%\MyApp\MySettings.config"/>
And do this to set my log4net configuration:
var configFile = ConfigurationManager.AppSettings.Get("MyLog4NetConfigFile");if( !string.IsNullOrEmpty(configFile)){ configFile = Environment.ExpandEnvironmentVariables(configFile); XmlConfigurator.Configure(new FileInfo(configFile));}