web-dev-qa-db-fra.com

Messages "Impossible de trouver les informations de schéma" de Log4Net

J'ai décidé d'utiliser log4net en tant que consignateur 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:

  1. Copiez chaque balise spécifique à log4net dans un fichier xml- séparé. Assurez-vous d'utiliser .xml comme 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 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 mettre tout ce qui concerne log4net dans ce fichier, mais je reçois toujours les mêmes messages.

56
xsl

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. Regarde ceci article de blog , ça m'a aidé.

17
steve_mtl

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">
68
Roger

Juste un mot d'avertissement à quiconque suit les conseils des réponses dans ce fil. La configuration de log4net dans un fichier XML situé à la racine du service Web peut poser un risque pour la sécurité, car elle sera accessible à quiconque par défaut. Sachez que si votre configuration contient des données sensibles, vous voudrez peut-être la placer ailleurs.

9
James McMahon

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 fichier log4net XSD dans C:\Programmes\Microsoft Visual Studio 8\XML\Schémas (ou à l'emplacement où votre Visual Studio est installé). En prime, vous devriez maintenant obtenir le support intellisense pour log4net

5
Wheelie

En réalité, 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)]
3
medvekoma

@steve_mtl: Le changement des extensions de fichier de .config à .xml a résolu le problème. Je vous remercie.

@Wheelie: Je ne pouvais pas 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. Copiez chaque balise spécifique à log4net dans un fichier xml- distinct. Assurez-vous d'utiliser .xml comme extension de fichier.
  2. Ajoutez la ligne suivante à AssemblyInfo.cs:

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

2
xsl

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.

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.

2
devstuff

Dans La réponse de Roger , où il a fourni un schéma, cela a très bien fonctionné pour moi, sauf lorsqu'un commentaire a été mentionné

Cette XSD se plaint de l'utilisation d'appenders 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 qui avait un xs:simpletype nommé log4netAppenderTypes et supprimé les énumérations. Au lieu de cela, je l'ai limité à un modèle de base .NET (je dis basique, car il ne prend en charge que typename uniquement, ou typename, Assembly - bien que quelqu'un puisse 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 laisse cela à l'auteur original s'il veut 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>
2
Kit

J'ai un projet de test asp à construire 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 donnant à mon web.config l'aspect :

<?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>
1
mark simmons

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

1
wcm

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>

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

0
Fysicus

Sans modifier votre installation de Visual Studio, et pour prendre en compte le versioning correct, 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 à cet emplacement.

0
Matt Enright

J'ai suivi la réponse de Kithttps://stackoverflow.com/a/11780781/6139051 et cela n'a pas fonctionné pour les valeurs AppenderType comme "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 regex dans la réponse de Kit ne fonctionnait pas. 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é sans faille.

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*)?+)?"/>
0
Volodymyr