The Story: I have a WinForms application with multiple assemblies - MainApp and Utilities. I use Utilities for my logging via log4net. All is fine with the world if I use a separate config file for log4net (aka log4net.config) - no issues.
However, IT staff finds it challenging to tweak two .config files (MainApp.exe.config and log4net.config). So, I'm trying to add my log4net config settings into my app.config file. Not having any luck.
I've tried several solutions posted in this forum. This one seemed to experience the same error I get: log4net configuration - failed to find section
I've tried putting this line in my Utilities:AssemblyInfo.cs
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "MainApp.exe.config", Watch = false)]
In my Utilities module where log4net is referenced, I have this:
const string TEMP_VARIABLE = "TEMP";
string tempDir = Environment.GetEnvironmentVariable( TEMP_VARIABLE );
StringBuilder userTempDirLogFile = new StringBuilder( tempDir );
userTempDirLogFile.Append( @"\" );
userTempDirLogFile.Append( Environment.MachineName );
userTempDirLogFile.Append( "_MAIN_" );
userTempDirLogFile.Append( DateTime.Now.DayOfWeek );
userTempDirLogFile.Append( ".log" );
log4net.GlobalContext.Properties["MainLogFileName"] = userTempDirLogFile.ToString();
StringBuilder utilityLogFile = ( userTempDirLogFile.Replace( "_MAIN_", "_UTILITIES_" ) );
log4net.GlobalContext.Properties["UtilityLogFileName"] = utilityLogFile.ToString();
log4net.Config.XmlConfigurator.Configure();
_mainLogger = LogManager.GetLogger( "MAIN" );
_mainLogger gets this error message:
log4net:ERROR XmlConfigurator: Failed to find configuration section 'log4net' in the application's .config file. Check your .config file for the <log4net> and <configSections> elements. The configuration section should look like: <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
I noticed in log4net source code that log4net.Config.XmlConfigurator.Configure() calls Assembly.GetCallingAssembly(). I've verified that GetCallingAssembly() is indeed MainApp. My program directory contains all necessary files.
This is my app.config
<?xml version="1.0"?>
<configuration>
<!-- configSections MUST be first! -->
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<log4net>
<appender name="MainLogFile" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="%property{MainLogFileName}"/>
<appendToFile value="false" />
<maximumFileSize value="20MB" />
<maxSizeRollBackups value="3" />
<param name="Encoding" value="unicodeFFFE" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{ISO8601}	%property{messageId}	%-5level	%message%newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="ALL" />
<param name="LevelMax" value="OFF" />
</filter>
</appender>
<appender name="UtilityLogFile" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="%property{UtilityLogFileName}"/>
<appendToFile value="false" />
<maximumFileSize value="20MB" />
<maxSizeRollBackups value="3" />
<param name="Encoding" value="unicodeFFFE" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{ISO8601}	%property{messageId}	%-5level	%message%newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="ALL" />
<param name="LevelMax" value="OFF" />
</filter>
</appender>
<logger name="MAIN">
<level value="DEBUG" />
<appender-ref ref="MainLogFile" />
</logger>
<logger name="UTILITY">
<level value="DEBUG" />
<appender-ref ref="UtilityLogFile" />
</logger>
</log4net>
<startup>
<!-- Leave sku out so that both 4.0 and 4.5 are supported -->
<supportedRuntime version="v4.0" />
</startup>
<system.windows.forms jitDebugging="true" />
<system.diagnostics>
<trace useGlobalLock="false" />
</system.diagnostics>
<appSettings>
<add key="PRINT_CALL_STACK" value="false"/>
<add key="TRACK_PERFORMANCE" value="false"/>
<add key="USING_TEST_MODE" value="false"/>
<add key="WAIT_FOR_LOGON" value="0"/>
</appSettings>
</configuration>
I figure I'm missing something, but no clue as to what. Thanks for your time.
Note: using VS2013 and log4net 1.2.13.0. Solution targets .NET 4.0 full and x86.