Log4Net “Imansible trovare le informazioni sullo schema”

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

Imansible trovare le informazioni sullo schema per l’elemento ‘log4net’ …

Di seguito sono riportate le parti rilevanti del mio web.config :

   

risolto:

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

nemo ha aggiunto:

Solo una parola di avvertimento per chiunque segua il consiglio delle risposte in questa discussione. Esiste un ansible rischio per la sicurezza avendo la configurazione log4net in un xml fuori dalla root del servizio web, in quanto sarà accessibile a chiunque per impostazione predefinita. Tieni presente che se la tua configurazione contiene dati sensibili, potresti metterla 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 metto tutto ciò che riguarda log4net in quel file, ma ricevo comunque gli stessi messaggi.

Ho avuto un take diverso e avevo bisogno della seguente syntax:

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

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

È ansible associare uno schema all’elemento log4net . Ce ne sono alcuni in giro, la maggior parte non fornisce completamente le varie opzioni disponibili. Ho creato il seguente xsd per fornire più verifiche possibili: http://csharptest.net/downloads/schema/log4net.xsd

È ansible associarlo facilmente log4net modificando l’elemento log4net :

  

Solo una parola di avvertimento per chiunque segua il consiglio delle risposte in questa discussione. Esiste un ansible rischio per la sicurezza avendo la configurazione log4net in un xml fuori dalla root del servizio web, in quanto sarà accessibile a chiunque per impostazione predefinita. Tieni presente che se la tua configurazione contiene dati sensibili, potresti metterla altrove.

Credo che tu stia vedendo 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 il file XSD di log4net in C: \ Programmi \ Microsoft Visual Studio 8 \ XML \ Schemas (o ovunque sia installato il tuo Visual Studio). Come ulteriore vantaggio ora dovresti ottenere supporto intellisense per log4net

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

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

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

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


Per riassumere, ecco come risolvere il problema:

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

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

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

Inoltre, l’uso di un’estensione .config invece di .xml evita il problema di sicurezza poiché IIS non pubblica i file * .config per impostazione predefinita.

Nella risposta di Roger , dove ha fornito uno schema, questo ha funzionato molto bene per me, tranne dove menzionava un commentatore

Questo XSD si lamenta dell’uso di appendici personalizzati. Permette solo un appender dal set predefinito (definito come enum) invece di renderlo semplicemente un campo stringa

Ho modificato lo schema originale che aveva un xs:simpletype denominato log4netAppenderTypes e rimosso le enumerazioni. L’ho invece limitato a un modello di battitura di base di .NET (dico di base perché supporta solo typename , o typename, assembly – comunque qualcuno può estenderlo.

Sostituisci semplicemente la definizione log4netAppenderTypes con quanto segue in XSD:

      

Sto restituendo questo all’autore originale se vuole includerlo nella sua versione ufficiale. Fino ad allora dovresti scaricare e modificare xsd e farne riferimento in modo relativo, ad esempio:

    

Hai provato a utilizzare un file log4net.config separato?

Ho ottenuto un progetto di prova asp per build mettendo il file xsd nella cartella degli schemi di Visual Studio come descritto sopra (per me è C: \ Programmi \ Microsoft Visual Studio 8 \ XML \ Schemas) e poi facendo il mio aspetto web.config come questo:

     

Senza modificare l’installazione di Visual Studio e prendere in considerazione il versioning corretto / etc. tra il resto del tuo team, aggiungi il file .xsd alla tua soluzione (come ‘elemento della soluzione’), o se lo vuoi solo per un particolare progetto, semplicemente inseriscilo 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 di configsection:

   

La definizione come tipo “System.Configuration.IgnoreSectionHandler” potrebbe essere la ragione per cui Visual Studio non mostra alcun messaggio di avviso / errore sul log4net?

Ho seguito la risposta di Kit https://stackoverflow.com/a/11780781/6139051 e non ha funzionato per valori di AppenderType come “log4net.Appender.TraceAppender, log4net”. L’assembly log4net.dll ha il AssemblyTitle di “log4net”, ovvero il nome dell’assembly non ha un punto all’interno, ecco perché la regex nella risposta di Kit non ha funzionato. Devo aggiungere il punto interrogativo dopo il terzo gruppo parentetico nelle espressioni regolari, dopodiché ha funzionato perfettamente.

La regex modificata ha il seguente aspetto: