it-swarm.com.de

Log4Net-Meldungen "Schemainformationen nicht gefunden"

Ich entschied mich für log4net als Logger für ein neues Webservice-Projekt. Alles funktioniert gut, aber ich bekomme viele Nachrichten wie die unten stehende für jedes log4net-Tag, das ich in meinem web.config verwende:

Es konnten keine Schemainformationen für .__ gefunden werden. das Element 'log4net' ...

Hier sind die relevanten Teile meines 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>

Gelöst:

  1. Kopieren Sie jedes log4net-spezifische Tag in eine separate xml-Datei. Stellen Sie sicher, dass Sie .xml als Dateierweiterung verwenden.
  2. Fügen Sie die folgende Zeile zu AssemblyInfo.cs hinzu:
[Assembly: log4net.Config.XmlConfigurator(ConfigFile = "xmlFile.xml", Watch = true)]

nemo hinzugefügt:

Nur ein Wort der Warnung an alle Befolgen Sie die Ratschläge der Antworten in dieser Thread. Es ist ein möglicher Sicherheitsrisiko durch die Verwendung von log4net Konfiguration in einer XML-Datei außerhalb des Stammverzeichnisses des Web-Service, wie es sein wird Standardmäßig für alle zugänglich. Gerade seien Sie beraten, wenn Ihre Konfiguration enthält vertrauliche Daten, die Sie möchten um es anderswo zu setzen.


@wcm: Ich habe versucht, eine separate Datei zu verwenden. Ich habe die folgende Zeile zu AssemblyInfo.cs hinzugefügt.

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

und füge alles, was mit log4net zu tun hat, in diese Datei, aber ich bekomme immer noch die gleichen Meldungen.

56
xsl

Ich hatte eine andere Einstellung und brauchte folgende Syntax:

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

was sich von xsls letztem Beitrag unterscheidet, aber für mich einen Unterschied gemacht hat. Schauen Sie sich diesen Blogbeitrag an , er hat mir geholfen.

17
steve_mtl

Sie können ein Schema an das log4net-Element binden. Es gibt ein paar davon, die meisten bieten die verschiedenen Optionen nicht vollständig an. Ich habe das folgende xsd erstellt, um so viel Verifizierung wie möglich zu ermöglichen: http://csharptest.net/downloads/schema/log4net.xsd

Sie können es leicht in die XML-Datei einbinden, indem Sie das log4net-Element ändern:

<log4net 
     xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
68
Roger

Nur ein Wort der Warnung an alle, folgen Sie den Ratschlägen der Antworten in diesem Thread. Es besteht ein mögliches Sicherheitsrisiko, wenn die log4net-Konfiguration in einer XML-Datei außerhalb des Stammes des Webdiensts abgelegt wird, da sie standardmäßig für jeden zugänglich ist. Wenden Sie sich einfach an, wenn Ihre Konfiguration sensible Daten enthält. Sie können sie an einer anderen Stelle einfügen.

9
James McMahon

Ich glaube, Sie sehen die Meldung, weil Visual Studio den log4net-Abschnitt der Konfigurationsdatei nicht überprüfen kann. Sie sollten dies beheben können, indem Sie log4net XSD in C:\Programme\Microsoft Visual Studio 8\XML\Schemas (oder wo auch immer Ihr Visual Studio installiert ist) kopieren. Als zusätzlichen Bonus sollten Sie jetzt Unterstützung für log4net erhalten

5
Wheelie

Eigentlich brauchen Sie sich nicht an die .xml-Erweiterung zu halten. Sie können im Attribut ConfigFileExtension eine beliebige andere Erweiterung angeben:

[Assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension=".config", Watch = true)]
3
medvekoma

@ steve_mtl: Das Problem wurde behoben, indem die Dateierweiterungen von .config in .xml geändert wurden. Vielen Dank.

@ Wheelie: Ich konnte Ihren Vorschlag nicht testen, da ich eine Lösung brauchte, die mit einer unveränderten Visual Studio-Installation funktioniert.


Um es zusammenzufassen, hier ist, wie man das Problem löst:

  1. Kopieren Sie jedes log4net-spezifische Tag in eine separate xml- Datei. Stellen Sie sicher, dass Sie .xml als Dateierweiterung verwenden.
  2. Fügen Sie die folgende Zeile zu AssemblyInfo.cs hinzu:

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

2
xsl

Für VS2008 fügen Sie einfach die Datei log4net.xsd zu Ihrem Projekt hinzu. VS sucht im Projektordner sowie im Installationsverzeichnis, das Wheelie erwähnt hat.

Durch die Verwendung einer Erweiterung .config anstelle von .xml wird das Sicherheitsproblem vermieden, da IIS standardmäßig keine * .config-Dateien bereitstellt.

2
devstuff

In Rogers Antwort , wo er ein Schema lieferte, funktionierte das sehr gut für mich, außer wo ein Kommentator dies erwähnte

Diese XSD beschwert sich über die Verwendung von benutzerdefinierten Appendern. Es erlaubt nur einen Appender aus der Standardmenge (definiert als Aufzählung), anstatt dieses Feld einfach als String-Feld zu definieren

Ich änderte das ursprüngliche Schema mit einem xs:simpletype mit dem Namen log4netAppenderTypes und entfernte die Aufzählungen. Ich habe es stattdessen auf ein grundlegendes .NET-Schreibmuster beschränkt (ich sage einfach, weil es nur typename oder nur typename, Assembly unterstützt - es kann jedoch von jemandem erweitert werden.

Ersetzen Sie einfach die log4netAppenderTypes-Definition in der XSD durch Folgendes:

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

Ich gebe es an den ursprünglichen Autor weiter, wenn er es in seine offizielle Version aufnehmen möchte. Bis dahin müssten Sie die xsd herunterladen und modifizieren und relativ darauf verweisen, zum Beispiel:

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

Ich habe ein Test-Asp-Projekt erstellt, indem ich die xsd-Datei wie oben beschrieben in den Ordner des Visual Studio-Schemas abgelegt habe (für mich ist dies C:\Programme\Microsoft Visual Studio 8\XML\Schemas) und mein web.config dann so aussehen :

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

Haben Sie versucht, eine separate Datei log4net.config zu verwenden?

1
wcm

Ich habe es etwas spät bemerkt, aber wenn Sie sich die Beispiele ansehen, die log4net liefert, können Sie sehen, wie sie alle Konfigurationsdaten in eine app.config einfügen.

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

Könnte die Definition als Typ "System.Configuration.IgnoreSectionHandler" der Grund dafür sein, dass Visual Studio keine Warn-/Fehlermeldungen in den log4net-Dateien anzeigt?

0
Fysicus

Ohne die Visual Studio-Installation zu ändern und die korrekte Versionierung/etc zu berücksichtigen. Fügen Sie im Rest Ihres Teams die .xsd-Datei zu Ihrer Lösung hinzu (als 'Solution Item'). Wenn Sie sie nur für ein bestimmtes Projekt wünschen, binden Sie sie einfach dort ein.

0
Matt Enright

Ich folgte Kit s Antwort https://stackoverflow.com/a/11780781/6139051 und es funktionierte nicht für AppenderType-Werte wie "log4net.Appender.TraceAppender". log4net ". Die Assembly log4net.dll hat den AssemblyTitle "log4net", d. H. Der Assemblyname enthält keinen Punkt. Aus diesem Grund hat der reguläre Ausdruck in Kits Antwort nicht funktioniert. Ich muss das Fragezeichen nach der dritten Klammergruppe im regulären Ausdruck einfügen, und danach hat es einwandfrei funktioniert.

Der modifizierte reguläre Ausdruck sieht folgendermaßen aus:

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