Log4Net Nachrichten „kann nicht Schemainformationen finden“
-
05-07-2019 - |
Frage
Ich entschied mich für log4net als Logger für ein neues Webservice-Projekt. Alles funktioniert gut, aber ich bekomme eine Menge von Nachrichten wie unten, für jeden Tag log4net Ich verwende in meinem web.config
:
konnte nicht Schemainformationen finden das Element 'log4net' ...
Im Folgenden 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:
- Kopieren jeden log4net bestimmten Tages zu einer separaten
xml
-Datei. Stellen Sie sicher,.xml
als Dateierweiterung verwenden. - Fügen Sie die folgende Zeile in
AssemblyInfo.cs
:
[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 eine mögliche Sicherheitsrisiko durch die log4net mit Konfiguration in einem XML-off der Wurzel der Web-Service, wird, wie es sein zugänglich standardmäßig für jeden. Gerade wenn Ihre Konfiguration empfohlen werden sensible Daten enthält, können Sie wollen um es sonst wo.
@wcm: Ich habe versucht, eine separate Datei. Ich habe die folgende Zeile AssemblyInfo.cs
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
und setzt alles mit log4net in dieser Datei zu tun, aber ich immer noch die gleichen Nachrichten erhalten.
Lösung
Ich hatte eine andere Perspektive, und benötigen die folgende Syntax:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.xml", Watch = true)]
, die unterscheidet sich von den letzten Beitrag des xsl, machte aber einen Unterschied für mich. Sehen Sie sich diese Blog-Post , half es mir.
Andere Tipps
Sie können auf das log4net
Element in einem Schema binden. Es gibt ein paar im Umlauf, die meisten voll verfügbar für die verschiedenen Optionen nicht zur Verfügung stellen. Ich habe die folgende XSD so viel Überprüfung wie möglich zur Verfügung zu stellen:
http://csharptest.net/downloads/schema/log4net.xsd
Sie können es in die xml binden leicht durch das log4net
Element ändern:
<log4net
xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
Nur ein Wort der Warnung an alle die Ratschläge der Antworten in diesem Thread folgen. Es besteht ein mögliches Sicherheitsrisiko die log4net-Konfiguration in einem XML-off der Wurzel des Web-Service, indem er, wie es jedem standardmäßig zugänglich sein wird. Nur beachten Sie, wenn Ihre Konfiguration sensible Daten enthält, können Sie es setzen sonst wo.
Ich glaube, Sie die Nachricht sehen, weil Visual Studio nicht weiß, wie der log4net-Abschnitt der Konfigurationsdatei zu validieren. Sie sollten dieses Problem beheben, indem er die log4net XSD in C kopieren: \ Programme \ Microsoft Visual Studio 8 \ XML \ Schemas (oder wo auch immer Ihr Visual Studio installiert ist). Als zusätzlichen Bonus sollten Sie jetzt Intellisense Unterstützung erhalten für log4net
Eigentlich brauchen Sie nicht auf die Erweiterung .xml zu bleiben. Sie können eine beliebige andere Erweiterung im ConfigFileExtension Attribute angeben:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension=".config", Watch = true)]
@steve_mtl: Ändern der Dateierweiterungen von .config
.xml
das Problem gelöst. Danke.
@Wheelie. Ich konnte Ihren Vorschlag nicht versuchen, weil ich eine Lösung benötigt, die mit einer unmodifizierten Visual Studio-Installation funktioniert
Um es zusammenzufassen, ist hier, wie das Problem zu lösen:
- Kopieren jeden log4net bestimmten Tages zu einer separaten
xml
-Datei. Stellen Sie sicher,.xml
als Dateierweiterung verwenden. -
Fügen Sie die folgende Zeile in
AssemblyInfo.cs
:[assembly: log4net.Config.XmlConfigurator(ConfigFile = "xmlFile.xml", Watch = true)]
Für VS2008 nur die log4net.xsd Datei zu Ihrem Projekt hinzufügen; VS sieht im Projektordner sowie das Installationsverzeichnis, das Wheelie erwähnt.
Auch eine .config Erweiterung anstelle von .xml vermeidet das Sicherheitsproblem, da IIS dient nicht * .config-Dateien standardmäßig aktiviert.
Roger Antwort , wo er ein Schema zur Verfügung gestellt, arbeitete das sehr gut für mich sei denn, ein Kommentator erwähnt
Diese XSD beschwert sich über die Verwendung von benutzerdefinierten Appen. Es kann nur für eine appender aus dem Standardsatz (als Enum definiert ist), anstatt einfach machen dies ein String-Feld
I modifiziert, um das ursprüngliche Schema, das eine xs:simpletype
namens log4netAppenderTypes
hatte und die Aufzählungen entfernt. Ich kann es stattdessen zu einem Muster Basic .NET Typisierung beschränkt (I Grund sagen, weil es unterstützt nur Type-Name nur, oder Typname, Montag -. Aber jemand es verlängern
Ersetzen Sie einfach die log4netAppenderTypes
Definition mit der folgenden in der 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>
Ich bin vorbei diese wieder auf den ursprünglichen Autor, wenn er will es in seiner offiziellen Version aufzunehmen. Bis dahin müßten Sie die XSD herunterladen und ändern und sie in einer relativen Weise verweisen, zum Beispiel:
<log4net
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../../../Dependencies/log4net/log4net.xsd">
<!-- ... -->
</log4net>
Haben Sie versucht, eine separate log4net.config Datei mit?
habe ich ein Test asp Projekt von Puting die XSD-Datei in den Visual Studio-Schemata Ordner zu erstellen, wie oben beschrieben (für mich ist C: \ Programme \ Microsoft Visual Studio 8 \ XML \ Schema) und dann mache meine web.config
wie folgt 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>
Ohne Ihre Visual Studio-Installation zu ändern und Berücksichtigung richtige Versionierung / etc zu nehmen. unter dem Rest Ihres Teams, die XSD-Datei zu Ihrer Lösung hinzu (als ‚Lösung Item‘), oder wenn Sie es für ein bestimmtes Projekt möchten, betten sie einfach da.
Ich bemerkte es ein bisschen spät, aber wenn man die Beispiele sehen in Log4Net Sie liefert können sie alle Konfigurationsdaten in eine app.config, mit einem Unterschied, die Registrierung von configsection sehen setzen:
<!-- Register a section handler for the log4net section -->
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
</configSections>
Könnte die Definition es als Typ „System.Configuration.IgnoreSectionHandler“ der Grund, Visual Studio zeigt keine Warnung / Fehlermeldungen auf den log4net Sachen?
Ich folgte Kit 's Antwort https://stackoverflow.com/a/11780781/6139051 und es nicht für AppenderType Werte wie gearbeitet "log4net.Appender.TraceAppender, log4net". Die log4net.dll Baugruppe hat die Assembly von „log4net“, das heißt der Assemblierung-Name keinen Punkt im Innern hat, das war, warum die Regex in Kit Antwort nicht funktioniert hat. Ich muß das Fragezeichen nach der dritten klammerten Gruppe in der regexp hinzuzufügen, und nach, dass es einwandfrei funktionierte.
Die modifizierte Regex sieht wie folgt aus:
<xs:pattern value="[A-Za-z_]\w*(\.[A-Za-z_]\w*)+(\s*,\s*[A-Za-z_]\w*(\.[A-Za-z_]\w*)?+)?"/>