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:

  1. Copie cada etiqueta específica de log4net en un archivo xml separado. Asegúrese de utilizar .xml como extensión de archivo.
  2. 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.

¿Fue útil?

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:

  1. Copie cada etiqueta específica de log4net en un archivo xml separado. Asegúrese de utilizar .xml como extensión de archivo.
  2. 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*)?+)?"/>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top