2008-10-06 5 views
53

J'ai décidé d'utiliser log4net comme enregistreur pour un nouveau projet de service Web. Tout fonctionne très bien, mais je reçois beaucoup de messages comme celui ci-dessous, pour chaque balise log4net J'utilise dans mon web.config:Log4Net Messages "Impossible de trouver l'information de schéma"

Impossible de trouver des informations de schéma pour l'élément « log4net » ...

Voici 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> 

SOLVED:

  1. Copiez chaque balise spécifique à log4net dans un fichier xml distinct. Assurez-vous d'utiliser .xml en tant qu'extension de fichier.
  2. Ajoutez la ligne suivante à AssemblyInfo.cs:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "xmlFile.xml", Watch = true)] 

nemo ajouté:

Juste un mot d'avertissement à quiconque suivre les conseils des réponses à ce fil. Il existe un risque de sécurité en ayant la configuration log4net dans un fichier XML hors de la racine du service Web, car il sera accessible à tous par défaut. Juste être conseillé si votre configuration contient des données sensibles, vous pouvez vouloir pour le mettre ailleurs.


@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 de mettre tout ce qui touche à log4net dans ce dossier, mais je reçois toujours les mêmes messages.

Répondre

17

J'ai eu une opinion différente, et avait besoin de la syntaxe suivante:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.xml", Watch = true)] 

qui diffère de dernier message de xsl, mais fait une différence pour moi. Découvrez ce blog post, ça m'a aidé.

+0

Alors que cela a fonctionné pour moi, dans la sortie de débogage il était avertissement sur les sections manquantes dans le fichier de configuration principal. Donc je devais les garder mais vides comme ceci '' pour faire disparaître l'avertissement –

1

Avez-vous essayé d'utiliser un fichier log4net.config distinct?

5

Je crois que vous voyez le message car Visual Studio ne sait pas comment valider la section log4net du fichier de configuration. Vous devriez être capable de résoudre ce problème en copiant le fichier log4net XSD dans C: \ Program Files \ Microsoft Visual Studio 8 \ XML \ Schemas (ou à l'endroit où votre Visual Studio est installé). En prime, vous devriez maintenant obtenir le soutien IntelliSense pour log4net

+0

Cela ne fonctionne pas pour moi. –

+4

Pour VS 2010, placez le fichier log4net XSD mentionné ci-dessus dans C: \ Program Files \ Microsoft Visual Studio 10.0 \ XML \ Schemas. Fermez et rouvrez VS. Ouvrez le fichier .config, allez à l'élément de menu XML -> Schémas, cliquez sur log4net.xsd et "Utiliser ce schéma" –

+0

@PeterM. Cela a fonctionné pour moi. Berry Nice! – IbrarMumtaz

2

@steve_mtl: La modification des extensions de fichier de .config à .xml a résolu le problème. Je vous [email protected]: Je n'ai pas pu essayer votre suggestion, car j'avais besoin d'une solution qui fonctionne avec une installation Visual Studio non modifiée.


Pour résumer, voici comment résoudre le problème:

  1. Copier tous les Log4net balise spécifique à une xml séparée -file. Assurez-vous d'utiliser .xml en tant qu'extension de fichier.
  2. Ajoutez la ligne suivante à AssemblyInfo.cs:

    [assembly: log4net.Config.XmlConfigurator(ConfigFile = "xmlFile.xml", Watch = true)]

67

Vous pouvez lier dans un schéma à l'élément log4net. Il y en a quelques-unes qui flottent, la plupart ne fournissent pas entièrement les différentes options disponibles. J'ai créé la xsd suivante pour fournir autant la vérification que possible: http://csharptest.net/downloads/schema/log4net.xsd

Vous pouvez lier dans le xml facilement 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"> 
+9

Très étrange que log4net n'inclut pas un XSD. –

+0

Je n'ai pas vraiment essayé de le faire pendant un certain temps, je ne pouvais pas le faire fonctionner sous Visual Studio 2005. Cela fonctionne, mais il lance toujours des avertissements sur tous les éléments XML. –

+4

Ce XSD se plaint de l'utilisation d'appenders personnalisés. Il permet seulement un appender de l'ensemble par défaut (défini en tant qu'enum) au lieu de simplement en faire un champ de chaîne –

8

Juste un mot d'avertissement à tous ceux qui suivre les conseils des réponses dans ce fil. Il y a un risque de sécurité possible en ayant la configuration de log4net dans un xml à la racine du service web, car il sera accessible à n'importe qui par défaut. Sachez simplement que si votre configuration contient des données sensibles, vous pouvez les placer ailleurs.

+10

La meilleure solution est d'utiliser une extension '.config' au lieu de' .xml'. IIS va bloquer les requêtes à .configs par défaut – STW

2

Pour VS2008, ajoutez simplement le fichier log4net.xsd à votre projet; VS regarde dans le dossier du projet ainsi que le répertoire d'installation mentionné par Wheelie. De plus, l'utilisation d'une extension .config au lieu de .xml évite le problème de sécurité puisque IIS ne sert pas les fichiers * .config par défaut.

3

En fait, vous n'avez pas besoin de coller à 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)] 
1

Je suis un projet asp de test pour construire par puting le fichier xsd dans le dossier des schémas de studio visuel comme décrit ci-dessus (pour moi il est C: \ Program Files \ Microsoft Visual studio 8 \ XML \ Schemas) puis faire mon web.config ressembler à ceci:

<?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> 
0

Sans modifier votre installation de Visual studio et de prendre en compte une bonne versionnage/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, il vous suffit de l'incorporer.

2

En Roger's answer, où il a fourni un schéma, cela a fonctionné très bien pour moi, sauf si un intervenant a mentionné

Cette XSD se plaint de l'utilisation des appenders personnalisés.Il permet seulement un appender de l'ensemble par défaut (défini comme ENUM) au lieu de faire simplement ce un champ de chaîne

J'ai modifié le schéma original qui avait un xs:simpletype nommé log4netAppenderTypes et enlevé les énumérations. Je la place qu'il restreint à un modèle de frappe .NET de base (je dis de base, car il supporte typename seulement, ou typename, l'assemblage -. Mais quelqu'un peut l'étendre

remplacer simplement la définition log4netAppenderTypes à ce qui suit dans le 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 passe ce retour à l'auteur original s'il veut l'inclure dans sa version officielle Jusque-là vous auriez à télécharger et modifier le xsd et la référence dans un. de manière relative, par exemple:

<log4net 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="../../../Dependencies/log4net/log4net.xsd"> 
    <!-- ... --> 
</log4net> 
+0

C'était en fait par conception et il y a beaucoup plus de lacunes dans ce schéma.Son intention était de fournir à VStudio un moyen de fournir une aide intelligente aux débutants (comme je l'étais à l'époque). L'utilisation du XSD avec des types personnalisés vous donne un avertissement; Cependant, le lecteur ne valide pas et cela fonctionnera bien. Vous pouvez utiliser un XSD personnalisé ou simplement ignorer l'erreur. –

0

Je l'ai remarqué un peu tard, mais si vous regardez dans les exemples log4net MEUBLE vous pouvez les voir mettre toutes les données de configuration dans un app.config, avec une différence, l'enregistrement de configsection:

<!-- Register a section handler for the log4net section --> 
<configSections> 
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler" /> 
</configSections> 

Est-ce que la définition comme type "System.Configuration.IgnoreSectionHandler" peut être la raison pour laquelle Visual Studio n'affiche aucun message d'avertissement/d'erreur sur le contenu de log4net?

0

J'ai suivi Kit la réponse https://stackoverflow.com/a/11780781/6139051 et cela n'a pas fonctionné pour les valeurs AppenderType comme "log4net.Appender.TraceAppender, log4net". L'assembly log4net.dll possède le AssemblyTitle de "log4net", c'est-à-dire que le nom de l'assembly n'a pas de point à l'intérieur, c'est pourquoi la regex dans la réponse de Kit n'a pas fonctionné. Je dois ajouter le point d'interrogation après le troisième groupe entre parenthèses dans l'expression rationnelle, et après cela il a fonctionné parfaitement.

Le regex modifié se présente comme suit:

<xs:pattern value="[A-Za-z_]\w*(\.[A-Za-z_]\w*)+(\s*,\s*[A-Za-z_]\w*(\.[A-Za-z_]\w*)?+)?"/> 
Questions connexes