Comment obtenir Log4Net à utiliser app.config

L'Histoire: j'ai une application WinForms avec plusieurs assemblages - MainApp et des services publics. J'ai utiliser des Utilitaires pour mon journalisation via log4net. Tout est très bien avec le monde si je utiliser un fichier de configuration pour log4net (aka log4net.config) - pas de problèmes.

Toutefois, le personnel constate qu'il est difficile de le tordre en deux .les fichiers de configuration (MainApp.exe.config et log4net.config). Donc, je vais essayer d'ajouter ma log4net paramètres de configuration dans mon application.fichier de configuration. N'ayant pas eu de chance.

J'ai essayé plusieurs solutions posté dans ce forum. Cela semblait faire l'expérience de la même erreur que j'obtiens:
log4net de configuration - impossible de trouver l'article

J'ai essayé de mettre cette ligne dans mon Utilitaires:AssemblyInfo.cs

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "MainApp.exe.config", Watch = false)]

Dans mon module Utilitaires où log4net est référencé, j'ai ceci:

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 obtient ce message d'erreur:

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" />

J'ai remarqué dans log4net code source qui log4net.Config.XmlConfigurator.Configurer() appelle de l'Assemblée.GetCallingAssembly(). J'ai vérifié que GetCallingAssembly() est en effet MainApp. Mon programme de répertoire contient tous les fichiers nécessaires.

C'est mon application.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}&#9;%property{messageId}&#9;%-5level&#9;%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}&#9;%property{messageId}&#9;%-5level&#9;%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>

Je me dis que je suis absent quelque chose, mais aucune idée de la nature. Merci pour votre temps.

Remarque: l'utilisation de VS2013 et log4net 1.2.13.0. Solution cible .NET 4.0 complet et x86.

InformationsquelleAutor Jay | 2015-06-25