web-services - eventlogappender - log4net table
Log4Net "No se pudo encontrar informaciĆ³n de esquema" (13)
¿Has intentado utilizar un archivo log4net.config por separado?
Decidí usar log4net como registrador para un nuevo proyecto de servicio web. Todo funciona bien, pero recibo muchos mensajes como el que se muestra a continuación, por cada etiqueta de log4net que utilizo en mi web.config
:
No se pudo encontrar la información del 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 usar.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 palabra de advertencia para cualquiera siga el consejo 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 colocarlo en otro lugar.
@wcm: Intenté usar un archivo separado. Agregué la siguiente línea a AssemblyInfo.cs
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
y pon todo lo relacionado con log4net en ese archivo, pero sigo recibiendo los mismos mensajes.
@steve_mtl: El cambio de las extensiones de archivo de .config
a .xml
resolvió el problema. Gracias.
@Wheelie: No pude probar su sugerencia, porque necesitaba una solución que funcione con una instalación de Visual Studio no modificada.
Para resumir, aquí está cómo resolver el problema:
- Copie cada etiqueta específica de log4net en un archivo
xml
separado. Asegúrese de usar.xml
como extensión de archivo. Agregue la siguiente línea a
AssemblyInfo.cs
:[assembly: log4net.Config.XmlConfigurator(ConfigFile = "xmlFile.xml", Watch = true)]
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 esto copiando log4net XSD en C: / Archivos de programa / Microsoft Visual Studio 8 / XML / Schemas (o donde esté instalado Visual Studio). Como una ventaja adicional, ahora debería obtener soporte intellisense para log4net
En la respuesta de Roger , donde proporcionó un esquema, esto funcionó muy bien para mí, excepto cuando un comentarista mencionó
Este XSD se queja del uso de appenders personalizados. Solo permite un appender del conjunto predeterminado (definido como una enumeración) en lugar de simplemente hacer de este un campo de cadena
xs:simpletype
el esquema original que tenía un xs:simpletype
llamado log4netAppenderTypes
y log4netAppenderTypes
las enumeraciones. En cambio, lo restringí a un patrón de tipeo .NET básico (digo básico porque solo admite typename solamente, o typename, assembly ; sin embargo, alguien puede extenderlo).
Simplemente reemplace la definición de log4netAppenderTypes
con lo siguiente en 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 pasando esto al autor original si quiere incluirlo en su versión oficial. Hasta entonces tendrías que descargar y modificar el xsd y referenciarlo de una manera relativa, por ejemplo:
<log4net
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../../../Dependencies/log4net/log4net.xsd">
<!-- ... -->
</log4net>
En realidad, no es necesario que se adhiera 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)]
Me di cuenta de que era un poco tarde, pero si miras los ejemplos que proporciona log4net, puedes verlos poner todos los datos de configuración en un app.config, con una diferencia, el registro de la sección de configuración:
<!-- Register a section handler for the log4net section -->
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
</configSections>
¿Podría la definición como tipo "System.Configuration.IgnoreSectionHandler" ser la razón por la que Visual Studio no muestra ningún mensaje de advertencia / error en el material de log4net?
Obtuve un proyecto asp de prueba para compilar al colocar el archivo xsd en la carpeta de los esquemas visuales del estudio como se describe arriba (para mí es C: / Archivos de programa / Microsoft Visual Studio 8 / XML / Schemas) y luego hacer que mi aspecto web.config
Me gusta esto:
<?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>
Para VS2008 simplemente agregue el archivo log4net.xsd a su proyecto; VS mira 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 los archivos * .config de manera predeterminada.
Puede enlazar en un esquema al elemento log4net
. Hay algunos que flotan alrededor, la mayoría no proporcionan las diversas opciones disponibles. Creé el siguiente xsd para proporcionar la mayor cantidad de verificación posible: http://csharptest.net/downloads/schema/log4net.xsd
Puede log4net
fácilmente en el xml modificando el elemento log4net
:
<log4net
xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
Seguí la respuesta de https://.com/a/11780781/6139051 y no funcionó para los valores de AppenderType como "log4net.Appender.TraceAppender, log4net". El ensamblado log4net.dll tiene AssemblyTitle de "log4net", es decir, el nombre del ensamblado no tiene un punto adentro, por eso la expresión regular en la respuesta de Kit no funcionaba. Tengo que agregar el signo de interrogación después del tercer grupo entre paréntesis en la expresión regular, y después de eso funcionó a la perfección.
La expresión regular modificada se ve así:
<xs:pattern value="[A-Za-z_]/w*(/.[A-Za-z_]/w*)+(/s*,/s*[A-Za-z_]/w*(/.[A-Za-z_]/w*)?+)?"/>
Sin modificar su instalación de Visual Studio, y tener en cuenta las versiones adecuadas / 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 incrústelo allí.
Solo una palabra de advertencia para cualquiera siga el consejo 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 colocarlo en otro lugar.
Tenía 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í. Mira esta publicación en el blog , me ayudó.