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}	%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>
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.
Vous devez vous connecter pour publier un commentaire.
L'assemblée de l'attribut doit être dans le MainApp projet, pas dans les Utilitaires de projet.
Comme il est dit dans le la documentation pour le montage des attributs
Utilities:AssemblyInfo.cs
? (Notez que lorsque votre configuration de l'application.fichier de configuration, laConfigFile
champ n'est pas obligatoire dans l'assemblée de l'attribut.)XmlElement log4NetSection = (XmlElement)ConfigurationManager.GetSection("log4net");
Utilities:AssemblyInfo.cs
. J'ai également supprimé lesConfigFile
champ dansMainApp:AssemblyInfo.cs
. Cette ligneSystem.Xml.XmlElement log4NetSection = (System.Xml.XmlElement)System.Configuration.ConfigurationManager.GetSection( "log4net" );
renvoyé une valeur null. Je suppose que pourrait être la source du problème, non?appSettings
mais, quand j'essaielog4net
- je obtenir cette exception:An unhandled exception of type 'System.Configuration.ConfigurationErrorsException' An error occurred creating the configuration section handler for log4net: Could not load file or assembly 'log4net' or one of its dependencies.
log4net.dll est dans le répertoire.ConfigFile = If specified, this is the filename of the configuration file to use with the XmlConfigurator. This file path is relative to the application base directory (AppDomain.CurrentDomain.BaseDirectory).
Mon appli est lancé à partir d'IE, de sorte que la valeur =C:\Program Files (x86)\Internet Explorer\
Retour àMainApp:app.config
et:[assembly: log4net.Config.XmlConfigurator( ConfigFile = "../My Company/My App/MainApp.exe.config", Watch = false )]
Encorenull
pourXmlElement
MainApp.exe.config
chargé, cela ne fonctionne toujours paslog4net.Config.XmlConfigurator.Configure(XMLElement);
Cependant, si j'ai mis un objet FileInfo pourMainApp.exe.config
, cela fonctionnelog4net.Config.XmlConfigurator.Configure(FileInfo);
LaConfigurationManager.GetSection()
juste ne peut pas trouver le<log4net/>
section. Merci @stuartd pour votre temps. J'ai marqué ce en tant que réponse. Il fonctionne à l'aide deFileInfo
, tout simplement pas le moyen privilégié de l'aideXMLElement
.Si vous voulez mettre le tout dans votre application.config, assurez-vous que vous avez cela dans le AssemblyInfo.cs:
vrai ou faux peut être changé si vous souhaitez suivre de manière dynamique ou pas le fichier de config pour les changements.
et dans votre fichier de configuration, assurez-vous que vous avez les sections appropriées. Par exemple dans la mienne j'ai:
Si vous mettez log4net paramètre de configuration dans le
app.config
ou laweb.config
fichier de le mettre dans leAssemblyInfo.cs
fichier dans leProperties
dossier de votre projet la ligne suivante:Citation de la manuel: