Best practice to include log4Net external config file in ASP.NET Best practice to include log4Net external config file in ASP.NET asp.net asp.net

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));}