2008-10-06 31 views
53

Decidí usar log4net como registrador para un nuevo proyecto de servicio web. Todo está funcionando bien, pero me da un montón de mensajes como el de abajo, para cada etiqueta log4net estoy usando en mi web.config:Log4Net mensajes "No se pudo encontrar información de esquema"

No se pudo encontrar la información de esquema para el elemento 'log4net' ...

A continuación se presentan las partes pertinentes 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:

  1. Copie cada etiqueta específica de log4net en un archivo separado xml. Asegúrese de usar .xml como extensión de archivo.
  2. Añadir la siguiente línea a AssemblyInfo.cs:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "xmlFile.xml", Watch = true)] 

nemo añadido:

Sólo una palabra de advertencia para cualquiera seguir 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 por defecto para cualquier persona. Solo tenga en cuenta que si su configuración contiene datos confidenciales, es posible que desee para colocarla en otro lugar.


@wcm: He intentado utilizar un archivo separado. He añadido la siguiente línea al AssemblyInfo.cs

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

y poner todo trato con log4net en ese archivo, pero sigo teniendo los mismos mensajes.

Respuesta

17

que tenía una opinión diferente, y necesitaba la siguiente sintaxis:

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

que se diferencia del último mensaje de XSL, pero hizo una diferencia para mí. Mira esto blog post, me ayudó.

+0

Si bien funcionó para mí, en la salida de depuración advertía sobre la falta de secciones en el archivo de configuración principal. Así que tuve que mantenerlos vacíos como este '' para hacer que la advertencia desaparezca –

1

¿Ha intentado utilizar un archivo log4net.config por separado?

5

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 un beneficio adicional que ahora debe conseguir compatibilidad con IntelliSense para log4net

+0

Esto no funcionó para mí. –

+4

Para VS 2010, coloque el log4net XSD mencionado anteriormente en C: \ Archivos de programa \ Microsoft Visual Studio 10.0 \ XML \ Schemas. Cierre y vuelva a abrir VS. Abra el archivo .config, vaya al elemento de menú XML -> Esquemas, haga clic en log4net.xsd y "Usar este esquema" –

+0

@PeterM. esto funcionó para mí. Berry Nice! – IbrarMumtaz

2

@steve_mtl: Al cambiar las extensiones de archivo de .config a .xml se solucionó el problema. Gracias.

@Wheelie: No pude probar su sugerencia, porque necesitaba una solución que funcione con una instalación de Visual Studio sin modificaciones.


Para resumir, aquí es cómo resolver el problema:

  1. Copiar todos los Log4net etiqueta específica a un xml -file separada. Asegúrese de usar .xml como extensión de archivo.
  2. Añadir la siguiente línea a AssemblyInfo.cs:

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

67

puede enlazar en un esquema para el elemento log4net. Hay algunos que flotan alrededor, la mayoría no proporcionan las diversas opciones disponibles. He creado la siguiente XSD para proporcionar la mayor cantidad de verificación como sea posible: http://csharptest.net/downloads/schema/log4net.xsd

puede enlazar en el xml fácilmente modificando el elemento log4net:

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

Es muy extraño que log4net no incluya un XSD. –

+0

En realidad no pude probar esto por un tiempo, no pude hacerlo funcionar en Visual Studio 2005. Bueno, funciona, pero todavía arroja advertencias sobre todos los elementos XML. –

+4

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 –

8

Sólo una palabra de advertencia a cualquiera que 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 colocarlo en otro lugar.

+10

La mejor solución es usar una extensión '.config' en lugar de' .xml'. IIS bloqueará las solicitudes a .configs de manera predeterminada – STW

2

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, usar una extensión .config en lugar de .xml evita el problema de seguridad ya que IIS no sirve archivos * .config de forma predeterminada.

3

En realidad, no es necesario que se adhiera a la extensión .xml. Se puede especificar cualquier otra extensión en el atributo ConfigFileExtension:

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

Tengo un proyecto ASP prueba para construir por que pone el archivo xsd en la carpeta de esquemas de Visual Studio como se describió anteriormente (para mí es C: \ Archivos de programa \ Microsoft Visual Studio 8 \ XML \ esquemas) y luego hacer mi web.config tener este aspecto:

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

Sin modificar la instalación de Visual Studio, y tener en cuenta el control de versiones adecuada/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í.

2

En Roger's answer, en la que ofreció un esquema, esto funcionó muy bien para mí, excepto donde un comentarista mencionó

Este XSD se queja de la utilización de appenders personalizados.Sólo se permite una appender del conjunto predeterminado (definido como una enumeración) en lugar de simplemente hacer este campo una cadena

he modificado el esquema original que tenían un xs:simpletype nombrado log4netAppenderTypes y quitó la enumeraciones. Yo en cambio restringido a un patrón básico escribiendo NET (digo básica, ya que sólo es compatible con nombretipo solamente, o nombretipo, montaje -. Sin embargo alguien puede extenderlo

Sólo tiene que sustituir la definición log4netAppenderTypes con la 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> 

estoy pasando esta de nuevo en el autor original si quiere incluirlo en su versión oficial hasta entonces usted tendría que descargar y modificar el xsd y hacer referencia a ella en una. manera relativa, por ejemplo:

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

Esto fue en realidad por diseño y hay muchas más fallas en este esquema.Su intención era proporcionar un medio para que VStudio brindara ayuda con inteligencia a los novatos (como yo lo era en ese momento). Usar el XSD con tipos personalizados te da una advertencia; sin embargo, el lector no valida y por lo tanto funcionará bien. Puede usar un XSD personalizado o simplemente ignorar el error. –

0

me di cuenta un poco tarde, pero si nos fijamos en los ejemplos log4net proporciona se puede ver los 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 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 lo de log4net?

0

Seguí la respuesta de Kithttps://stackoverflow.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 funcionó. 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 tiene el siguiente aspecto:

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