Log4Net & # 8220; Impossible de trouver les informations sur le schéma & # 8221; messages
-
05-07-2019 - |
Question
J'ai décidé d'utiliser log4net comme enregistreur de données pour un nouveau projet de service Web. Tout fonctionne bien, mais je reçois beaucoup de messages comme celui ci-dessous, pour chaque tag log4net que j'utilise dans mon web.config
:
Impossible de trouver les informations de schéma pour l'élément 'log4net' ...
Vous trouverez ci-dessous les parties pertinentes de mon web.config
:
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\log.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="100KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level: %message%newline" />
</layout>
</appender>
<logger name="TIMServerLog">
<level value="DEBUG" />
<appender-ref ref="RollingFileAppender" />
</logger>
</log4net>
Résolu:
- Copiez chaque balise spécifique à log4net dans un fichier
xml
distinct. Veillez à utiliser.xml
comme extension de fichier. - Ajoutez la ligne suivante à
AssemblyInfo.cs
:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "xmlFile.xml", Watch = true)]
nemo ajouté:
Juste un mot d'avertissement à quiconque suivez les conseils des réponses dans ce fil. Il y a un possible risque de sécurité en ayant le log4net configuration dans un xml de la racine du service Web, comme il sera accessible à quiconque par défaut. Juste être informé si votre configuration contient des données sensibles, vous voudrez peut-être pour le mettre ailleurs où.
@wcm: J'ai essayé d'utiliser un fichier séparé. J'ai ajouté la ligne suivante à AssemblyInfo.cs
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
et mettez tout ce qui a trait à log4net dans ce fichier, mais je reçois toujours les mêmes messages.
La solution
J'avais une prise différente et j'avais besoin de la syntaxe suivante:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.xml", Watch = true)]
qui diffère du dernier message de xsl, mais a fait une différence pour moi. Découvrez ceci article de blog , cela m’a aidé.
Autres conseils
Vous pouvez lier un schéma à l'élément log4net
. Il y en a quelques-uns qui flottent, la plupart ne fournissent pas pleinement les différentes options disponibles. J'ai créé le xsd suivant pour fournir autant de vérifications que possible:
http://csharptest.net/downloads/schema/log4net.xsd
Vous pouvez facilement le lier au xml en modifiant l'élément log4net
:
<log4net
xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
Juste un mot d'avertissement à qui que ce soit, suivez le conseil des réponses dans ce fil. Le fait de placer la configuration log4net dans un fichier XML à la racine du service Web constitue un risque possible pour la sécurité, car il sera accessible à quiconque par défaut. Sachez simplement que si votre configuration contient des données sensibles, vous voudrez peut-être la placer ailleurs.
Je pense que vous voyez le message car Visual Studio ne sait pas comment valider la section log4net du fichier de configuration. Vous devriez pouvoir résoudre ce problème en copiant le log4net XSD dans C: \ Programmes \ Microsoft Visual Studio 8 \ XML \ Schémas (ou à l’endroit où votre Visual Studio est installé). En prime, vous devriez maintenant obtenir le support intellisense pour log4net
En fait, vous n’avez pas besoin de vous en tenir à l’extension .xml. Vous pouvez spécifier toute autre extension dans l'attribut ConfigFileExtension:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension=".config", Watch = true)]
@steve_mtl: Le changement des extensions de fichier de .config
à .xml
a résolu le problème. Merci.
@Wheelie: Je ne pouvais pas essayer votre suggestion, car j'avais besoin d'une solution qui fonctionne avec une installation de Visual Studio non modifiée.
Pour résumer, voici comment résoudre le problème:
- Copiez chaque balise spécifique à log4net dans un fichier
xml
distinct. Veillez à utiliser.xml
comme extension de fichier. -
Ajoutez la ligne suivante à
AssemblyInfo.cs
:[assembly: log4net.Config.XmlConfigurator (ConfigFile = "xmlFile.xml", Watch = true)]
Pour VS2008, ajoutez simplement le fichier log4net.xsd à votre projet. VS recherche dans le dossier du projet ainsi que dans le répertoire d'installation mentionné par Wheelie.
En outre, l'utilisation d'une extension .config au lieu de .xml évite le problème de sécurité, car IIS ne sert pas les fichiers * .config par défaut.
Dans la réponse de Roger , dans laquelle il fournissait un schéma, cela fonctionnait très bien pour moi, sauf lorsqu'un commentateur a mentionné
Cette XSD se plaint de l’utilisation d’appendeurs personnalisés. Il autorise uniquement un appender à partir du jeu par défaut (défini comme une énumération) au lieu d'en faire simplement un champ de chaîne
J'ai modifié le schéma d'origine comportant un type xs: simpletype
nommé log4netAppenderTypes
et supprimé les énumérations. Au lieu de cela, je l'ai limité à un modèle de frappe .NET de base (je dis basique, car il ne prend en charge que nom_type , ou nom_type, assembly , mais quelqu'un peut l'étendre.
Remplacez simplement la définition log4netAppenderTypes
par la suivante dans le fichier XSD:
<xs:simpleType name="log4netAppenderTypes">
<xs:restriction base="xs:string">
<xs:pattern value="[A-Za-z_]\w*(\.[A-Za-z_]\w*)+(\s*,\s*[A-Za-z_]\w*(\.[A-Za-z_]\w*)+)?"/>
</xs:restriction>
</xs:simpleType>
Je renvoie ceci à l'auteur original s'il souhaite l'inclure dans sa version officielle. Jusque-là, vous devez télécharger et modifier le fichier xsd et le référencer de manière relative, par exemple:
<log4net
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../../../Dependencies/log4net/log4net.xsd">
<!-- ... -->
</log4net>
Avez-vous essayé d'utiliser un fichier séparé log4net.config?
J'ai créé un projet asp de test en plaçant le fichier xsd dans le dossier schémas de visual studio, comme décrit ci-dessus (pour moi, il s'agit de C: \ Programmes \ Microsoft Visual Studio 8 \ XML \ Schémas), puis en faisant ma code> web.config se présente comme suit:
<?xml version="1.0"?>
<!--
Note: As an alternative to hand editing this file you can use the
web admin tool to configure settings for your application. Use
the Website->Asp.Net Configuration option in Visual Studio.
A full list of settings and comments can be found in
machine.config.comments usually located in
\Windows\Microsoft.Net\Framework\v2.x\Config
-->
<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<appSettings>
</appSettings>
<connectionStrings>
</connectionStrings>
<system.web>
<trace enabled="true" pageOutput="true" />
<!--
Set compilation debug="true" to insert debugging
symbols into the compiled page. Because this
affects performance, set this value to true only
during development.
-->
<compilation debug="true" />
<!--
The <authentication> section enables configuration
of the security authentication mode used by
ASP.NET to identify an incoming user.
-->
<authentication mode="Windows" />
<customErrors mode="Off"/>
<!--
<customErrors mode="Off"/>
The <customErrors> section enables configuration
of what to do if/when an unhandled error occurs
during the execution of a request. Specifically,
it enables developers to configure html error pages
to be displayed in place of a error stack trace.
<customErrors mode="On" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
-->
</system.web>
<log4net xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<!-- Please make shure the ..\\Logs directory exists! -->
<param name="File" value="Logs\\Log4Net.log"/>
<!--<param name="AppendToFile" value="true"/>-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c %m%n"/>
</layout>
</appender>
<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
<to value="" />
<from value="" />
<subject value="" />
<smtpHost value="" />
<bufferSize value="512" />
<lossy value="true" />
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="WARN"/>
</evaluator>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline%date [%thread] %-5level %logger [%property] - %message%newline%newline%newline" />
</layout>
</appender>
<logger name="File">
<level value="ALL" />
<appender-ref ref="LogFileAppender" />
</logger>
<logger name="EmailLog">
<level value="ALL" />
<appender-ref ref="SmtpAppender" />
</logger>
</log4net>
</configuration>
Sans modifier votre installation de Visual Studio, et pour prendre en compte le correctif des versions / etc. parmi le reste de votre équipe, ajoutez le fichier .xsd à votre solution (en tant qu’élément de solution) ou, si vous ne le souhaitez que pour un projet particulier, intégrez-le simplement ici.
Je l'ai remarqué un peu tard, mais si vous regardez dans les exemples fournis par log4net, vous pouvez les voir mettre toutes les données de configuration dans un app.config, à une différence près, l'enregistrement de la configuration:
<!-- Register a section handler for the log4net section -->
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
</configSections>
La définition pourrait-elle être du type " System.Configuration.IgnoreSectionHandler " est la raison pour laquelle Visual Studio n’affiche aucun message d’avertissement / erreur sur les éléments log4net?
J'ai suivi la réponse du kit https://stackoverflow.com/a/11780781/6139051 et cela n'a pas fonctionné pour les valeurs AppenderType telles que" log4net.Appender.TraceAppender, log4net ". L'assembly log4net.dll a le titre d'assembly de "log4net", c'est-à-dire que le nom de l'assembly n'a pas de point à l'intérieur, c'est pourquoi la réponse rationnelle dans la réponse de Kit n'a pas fonctionné. Je dois ajouter le point d’interrogation après le troisième groupe de parenthèses dans l’expression rationnelle, et ensuite cela a fonctionné parfaitement.
La regex modifiée ressemble à ceci:
<xs:pattern value="[A-Za-z_]\w*(\.[A-Za-z_]\w*)+(\s*,\s*[A-Za-z_]\w*(\.[A-Za-z_]\w*)?+)?"/>