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:
xml
-Datei. Stellen Sie sicher, dass Sie .xml
als Dateierweiterung verwenden.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.
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.
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">
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.
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
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)]
@ 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:
xml
- Datei. Stellen Sie sicher, dass Sie .xml
als Dateierweiterung verwenden.Fügen Sie die folgende Zeile zu AssemblyInfo.cs
hinzu:
[Assembly: log4net.Config.XmlConfigurator(ConfigFile = "xmlFile.xml", Watch = true)]
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.
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>
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>
Haben Sie versucht, eine separate Datei log4net.config zu verwenden?
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?
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.
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*)?+)?"/>