Log4Net & # 8220; No se pudo encontrar la información del esquema & # 8221; mensajes
-
05-07-2019 - |
Pregunta
Decidí usar log4net como registrador para un nuevo proyecto de servicio web. Todo funciona bien, pero recibo muchos mensajes como el de abajo, por cada etiqueta log4net que estoy usando en mi web.config
:
No se pudo encontrar información de esquema para el elemento 'log4net' ...
A continuación se muestran las partes relevantes de mi 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>
Resuelto:
- Copie cada etiqueta específica de log4net en un archivo
xml
separado. Asegúrese de utilizar.xml
como extensión de archivo. - Agregue la siguiente línea a
AssemblyInfo.cs
:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "xmlFile.xml", Watch = true)]
nemo agregado:
Solo una advertencia para cualquiera Sigue los consejos de las respuestas en. este hilo Hay una posible Riesgo de seguridad al tener el log4net Configuración en un XML desde la raíz. del servicio web, como será Accesible para cualquiera por defecto. Sólo Ser avisado si su configuración contiene datos sensibles, es posible que desee para ponerlo en otro lugar donde.
@wcm: Intenté usar un archivo separado. Agregué la siguiente línea a AssemblyInfo.cs
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
y coloque todo lo relacionado con log4net en ese archivo, pero sigo recibiendo los mismos mensajes.
Solución
Tuve una opinión diferente y necesitaba la siguiente sintaxis:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.xml", Watch = true)]
que difiere de la última publicación de xsl, pero hizo una diferencia para mí. Echa un vistazo a este publicación de blog , me ayudó.
Otros consejos
Puede enlazar un esquema al elemento log4net
. Hay algunos que flotan alrededor, la mayoría no proporciona todas las opciones disponibles. Creé el siguiente xsd para proporcionar la mayor verificación posible:
http://csharptest.net/downloads/schema/log4net.xsd
Puede enlazarlo fácilmente al xml modificando el elemento log4net
:
<log4net
xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
Solo una advertencia para cualquiera, siga los consejos de las respuestas en este hilo. Existe un posible riesgo de seguridad al tener la configuración de log4net en un xml fuera de la raíz del servicio web, ya que será accesible para cualquiera de forma predeterminada. Solo tenga en cuenta que si su configuración contiene datos confidenciales, puede colocarlos en otro lugar.
Creo que está viendo el mensaje porque Visual Studio no sabe cómo validar la sección log4net del archivo de configuración. Debería poder solucionar este problema copiando el log4net XSD en C: \ Archivos de programa \ Microsoft Visual Studio 8 \ XML \ Schemas (o en cualquier lugar donde esté instalado Visual Studio). Como bono adicional, ahora debería obtener soporte intellisense para log4net
En realidad, no es necesario atenerse a la extensión .xml. Puede especificar cualquier otra extensión en el atributo ConfigFileExtension:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension=".config", Watch = true)]
@steve_mtl: el cambio de las extensiones de archivo de .config
a .xml
solucionó el problema. Gracias.
@Wheelie: No pude probar tu sugerencia, porque necesitaba una solución que funcione con una instalación de Visual Studio sin modificar.
Para resumir, aquí está cómo resolver el problema:
- Copie cada etiqueta específica de log4net en un archivo
xml
separado. Asegúrese de utilizar.xml
como extensión de archivo. -
Agregue la siguiente línea a
AssemblyInfo.cs
:[ensamblado: log4net.Config.XmlConfigurator (ConfigFile = " xmlFile.xml " ;, Watch = true)]
Para VS2008, simplemente agregue el archivo log4net.xsd a su proyecto; VS busca en la carpeta del proyecto, así como en el directorio de instalación que mencionó Wheelie.
Además, el uso de una extensión .config en lugar de .xml evita el problema de seguridad ya que IIS no sirve archivos * .config de forma predeterminada.
En respuesta de Roger , donde proporcionó un esquema, esto funcionó muy bien para mí, excepto cuando un comentarista mencionó
Este XSD se está quejando del uso de agregadores personalizados. Solo permite un agregador del conjunto predeterminado (definido como una enumeración) en lugar de simplemente hacer de este un campo de cadena
Modifiqué el esquema original que tenía un xs: simpletype
denominado log4netAppenderTypes
y eliminé las enumeraciones. En su lugar, lo restringí a un patrón de escritura .NET básico (digo básico porque solo es compatible con nombre de tipo o nombre de tipo, conjunto , sin embargo, alguien puede extenderlo.
Simplemente reemplace la definición de log4netAppenderTypes
con lo siguiente en el 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>
Le estoy devolviendo esto al autor original si quiere incluirlo en su versión oficial. Hasta entonces, tendría que descargar y modificar el xsd y hacer referencia a él de manera relativa, por ejemplo:
<log4net
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../../../Dependencies/log4net/log4net.xsd">
<!-- ... -->
</log4net>
¿Ha intentado usar un archivo log4net.config separado?
Obtuve un proyecto asp de prueba para compilar al colocar el archivo xsd en la carpeta de esquemas de Visual Studio como se describe anteriormente (para mí es C: \ Archivos de programa \ Microsoft Visual Studio 8 \ XML \ Schemas) y luego hacer mi < El código> web.config se ve así:
<?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>
Sin modificar su instalación de Visual Studio, y tener en cuenta las versiones correctas / etc. entre el resto de su equipo, agregue el archivo .xsd a su solución (como un 'Elemento de solución'), o si solo lo desea para un proyecto en particular, simplemente insértelo allí.
Lo noté un poco tarde, pero si observa los ejemplos que proporciona log4net, puede ver cómo ponen todos los datos de configuración en un app.config, con una diferencia, el registro de configsection:
<!-- Register a section handler for the log4net section -->
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
</configSections>
Podría definirse como tipo " System.Configuration.IgnoreSectionHandler " ¿Es la razón por la que Visual Studio no muestra ningún mensaje de advertencia / error en las cosas de log4net?
Seguí la respuesta de Kit https://stackoverflow.com/a/11780781/6139051 y no funcionó para los valores de AppenderType como " log4net.Appender.TraceAppender, log4net " ;. El ensamblaje log4net.dll tiene el Título de asamblea de " log4net " ;, es decir, el nombre del ensamblaje no tiene un punto dentro, por eso la expresión regular en la respuesta de Kit no funcionó. Tengo que agregar el signo de interrogación después del tercer grupo de paréntesis en la expresión regular, y después de eso funcionó perfectamente.
La expresión regular modificada se parece a la siguiente:
<xs:pattern value="[A-Za-z_]\w*(\.[A-Za-z_]\w*)+(\s*,\s*[A-Za-z_]\w*(\.[A-Za-z_]\w*)?+)?"/>