Domanda

Ho deciso di utilizzare log4net come logger per un nuovo progetto di servizi web. Tutto funziona bene, ma ricevo molti messaggi come quello qui sotto, per ogni tag log4net che sto usando nel mio web.config :

  

Impossibile trovare le informazioni sullo schema per   l'elemento 'log4net' ...

Di seguito sono riportate le parti rilevanti del mio 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>

Risolto:

  1. Copia ogni tag specifico di log4net in un file xml separato. Assicurati di utilizzare .xml come estensione del file.
  2. Aggiungi la seguente riga a AssemblyInfo.cs :
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "xmlFile.xml", Watch = true)]

nemo aggiunto:

  

Solo un avvertimento per chiunque   seguire i consigli delle risposte in   questa discussione. C'è un possibile   rischio per la sicurezza con log4net   configurazione in un XML dalla radice   del servizio web, come sarà   accessibile a chiunque per impostazione predefinita. Appena   essere avvisato se la tua configurazione   contiene dati sensibili che potresti desiderare   per dirlo altrove.


@wcm: ho provato a utilizzare un file separato. Ho aggiunto la seguente riga a AssemblyInfo.cs

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

e metti tutto ciò che riguarda log4net in quel file, ma ho ancora gli stessi messaggi.

È stato utile?

Soluzione

Avevo un approccio diverso e avevo bisogno della seguente sintassi:

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

che differisce dall'ultimo post di xsl, ma per me ha fatto la differenza. Dai un'occhiata a questo post sul blog , mi ha aiutato.

Altri suggerimenti

Puoi associare uno schema all'elemento log4net . Ce ne sono alcuni che galleggiano, la maggior parte non prevede completamente le varie opzioni disponibili. Ho creato il seguente xsd per fornire la massima verifica possibile: http://csharptest.net/downloads/schema/log4net.xsd

Puoi collegarlo facilmente all'xml modificando l'elemento log4net :

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

Solo una parola di avvertimento per chiunque segua il consiglio delle risposte in questo thread. Esiste un possibile rischio per la sicurezza avendo la configurazione di log4net in un XML dalla radice del servizio Web, poiché sarà accessibile a chiunque per impostazione predefinita. Informati solo se la tua configurazione contiene dati sensibili, potresti volerlo inserire altrove.

Credo che visualizzi il messaggio perché Visual Studio non sa come convalidare la sezione log4net del file di configurazione. Dovresti essere in grado di risolvere questo problema copiando log4net XSD in C: \ Programmi \ Microsoft Visual Studio 8 \ XML \ Schemas (o ovunque sia installato Visual Studio). Come bonus aggiuntivo ora dovresti ottenere il supporto intellisense per log4net

In realtà non è necessario attenersi all'estensione .xml. È possibile specificare qualsiasi altra estensione nell'attributo ConfigFileExtension:

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

@steve_mtl: la modifica delle estensioni dei file da .config a .xml ha risolto il problema. Grazie.

@Wheelie: non ho potuto provare il tuo suggerimento, perché avevo bisogno di una soluzione che funzioni con un'installazione non modificata di Visual Studio.


Per riassumere, ecco come risolvere il problema:

  1. Copia ogni tag specifico di log4net in un file xml separato. Assicurati di utilizzare .xml come estensione del file.
  2. Aggiungi la seguente riga a AssemblyInfo.cs :

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

Per VS2008 basta aggiungere il file log4net.xsd al progetto; VS cerca nella cartella del progetto e nella directory di installazione menzionata da Wheelie.

Inoltre, l'utilizzo di un'estensione .config anziché .xml evita il problema di sicurezza poiché IIS non fornisce i file * .config per impostazione predefinita.

In risposta di Roger , dove ha fornito uno schema, ha funzionato molto bene per me, tranne nei casi in cui un commentatore ha menzionato

  

Questo XSD si lamenta dell'uso di appendici personalizzate. Consente solo un appender dal set predefinito (definito come enum) anziché semplicemente trasformarlo in un campo stringa

Ho modificato lo schema originale che aveva un xs: simpletype chiamato log4netAppenderTypes e ho rimosso le enumerazioni. L'ho invece limitato a un modello di digitazione .NET di base (dico di base perché supporta solo nome tipografico o nome tipografico, assembly - tuttavia qualcuno può estenderlo.

Sostituisci semplicemente la definizione log4netAppenderTypes con la seguente nell'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>

Lo sto restituendo all'autore originale se vuole includerlo nella sua versione ufficiale. Fino ad allora dovresti scaricare e modificare xsd e fare riferimento in modo relativo, ad esempio:

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

Hai provato a utilizzare un file log4net.config separato?

Ho ottenuto un progetto asp test da compilare inserendo il file xsd nella cartella degli schemi di Visual Studio come descritto sopra (per me è C: \ Programmi \ Microsoft Visual Studio 8 \ XML \ Schemas) e quindi facendo il mio < code> web.config assomiglia a questo:

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

Senza modificare l'installazione di Visual Studio e prendere in considerazione il controllo delle versioni / etc. tra il resto del tuo team, aggiungi il file .xsd alla tua soluzione (come "elemento soluzione"), o se lo desideri solo per un determinato progetto, incorporalo lì.

L'ho notato un po 'tardi, ma se guardi gli esempi forniti da log4net puoi vederli mettere tutti i dati di configurazione in un app.config, con una differenza, la registrazione della configurazione:

<!-- Register a section handler for the log4net section -->
<configSections>
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
</configSections>

Potrebbe la definizione come tipo " System.Configuration.IgnoreSectionHandler " essere il motivo per cui Visual Studio non mostra alcun messaggio di avviso / errore sull'elemento log4net?

Ho seguito la risposta di Kit https://stackoverflow.com/a/11780781/6139051 e non ha funzionato con i valori AppenderType come " log4net.Appender.TraceAppender, log4net " ;. L'assembly log4net.dll ha il AssemblyTitle di " log4net " ;, cioè il nome dell'assembly non ha un punto all'interno, ecco perché il regex nella risposta di Kit non ha funzionato. Devo aggiungere il punto interrogativo dopo il terzo gruppo tra parentesi nella regexp, e successivamente ha funzionato perfettamente.

Il regex modificato è simile al seguente:

<xs:pattern value="[A-Za-z_]\w*(\.[A-Za-z_]\w*)+(\s*,\s*[A-Za-z_]\w*(\.[A-Za-z_]\w*)?+)?"/>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top