La configurazione di Log4Net nel file esterno non funziona

Stiamo usando log4net e vogliamo specificare la sua configurazione in un file di configurazione esterno (come abbiamo fatto con altre sezioni). Per fare ciò abbiamo modificato la sezione log4net in App.config in:

... 
... ...

E nel file Log.Config (stessa directory di App.config) abbiamo:

          

Tuttavia, quando eseguiamo l’app, non viene creato nessun file di registro (e nessuna registrazione eseguita). Non ci sono messaggi di errore in uscita alla console.

Se spostiamo nuovamente il contenuto del file Log.config in App.config (sostituendo la prima riga di codice sopra), funziona come previsto. Qualche idea sul perché non funziona in un file esterno?

Hai il seguente attributo nel tuo file AssemblyInfo.cs :

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

e codice come questo all’inizio di ogni class che richiede funzionalità di registrazione:

 private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

Ho un post sul blog che contiene questa e altre informazioni qui .

C’è un difetto aperto su questo problema. Log4Net non supporta l’attributo configSource degli elementi di configurazione. Per utilizzare una soluzione di file puramente di configurazione, utilizzare la chiave log4net.Config in appSettings.

Passaggio 1: includere la normale definizione della sezione di configurazione:

  

Passaggio 2: utilizzare la chiave magic log4net.Config in appSettings.

    

Passaggio 3: Contribuire a una patch per correggere la gestione di configSource.

Il passo che è stato mancato è

 log4net.Config.XmlConfigurator.Configure(); 

questo causerà l’utilizzo di configSource. Assicurati di chiamarlo una volta prima di chiamare GetLogger ();

Assicurati che il tuo file log4net.config sia impostato con le seguenti proprietà:

Azione di costruzione: contenuto

Copia nella directory di output: copia sempre

O usare,

   

o semplicemente,

 log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo("Log4Net.config")); 

In entrambi i casi il file, Log4Net.config, dovrebbe trovarsi nella directory di output. È ansible farlo impostando le proprietà del file Log4Net.config in Solution Explorer. Crea azione – Contenuto e copia nella directory di output – Copia sempre

Supponendo che tu abbia un file di configurazione esterno chiamato log4net.config che viene copiato nella tua directory di distribuzione, puoi configurarlo in questo modo:

 using System; using System.Collections.Generic; using System.Windows.Forms; using System.Reflection; using log4net; namespace MyAppNamespace { static class Program { //declare it as static and public so all classs in the project can access it //like so: Program.log.Error("got an error"); public static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program)); ///  /// The main entry point for the application. ///  [STAThread] static void Main() { //configure it to use external file log4net.Config.XmlConfigurator.Configure(new Uri(Application.StartupPath + "\\log4net.config")); //use it log.Debug("############# STARING APPLICATION #################"); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FormMain()); } } } 

Fai attenzione a questo problema …

Nel mio caso tutto è stato configurato correttamente. Il problema è che ho utilizzato Web Deploy all’interno di Visual Studio 2013 per caricare il sito su WinHost.com e reimpostare gli ACL sul server. Questo a sua volta revocava tutte le autorizzazioni su cartelle e file – log4net non poteva scrivere il file.

Puoi leggere di più a riguardo qui:

Come impedire a Web Deploy / MSBuild di incasinare le autorizzazioni del server

Ho chiesto al team di supporto di ripristinare gli ACL e quindi log4net ha iniziato a sputare i log. 🙂

È anche ansible triggersre una modalità di debug per log4net . Inserisci questo nel file App.config:

            

e riceverai almeno dei messaggi di errore, dai quali puoi ricavare ciò che è andato esattamente storto. Nel mio caso ho semplicemente dimenticato di impostare Copy to output directory su Copy Always .

@ Mitch, risulta che c’è un file con la dichiarazione [assembly: …], ma non aveva la proprietà ConfigFile.

Una volta che l’ho aggiunto e indirizzato a Log.config, ha iniziato a funzionare. Avrei pensato che avrebbe funzionato come tutte le altre sezioni di configurazione (ad esempio AppSettings) e accettare i file di configurazione esterni senza modifiche.

Non abbiamo la seconda affermazione che hai menzionato, poiché la avvolgiamo in un provider di registri statici globali.

Ho avuto lo stesso problema, oltre ad avere

 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net")] 

nel progetto in esecuzione, ho anche avuto la seguente riga in un progetto di riferimento:

 [assembly: log4net.Config.XmlConfigurator] 

Quando ho rimosso questa linea nei progetti di riferimento, i log iniziano ad apparire.

Nel mio caso ho ricevuto questo messaggio di errore:

 log4net: config file [C:\........\bin\Debug\log4net.config] not found. 

E log4net.config il file era nel progetto di Visual Studio 2017, ma quando ho controllato il file nella cartella bin\Debug non riuscivo a trovarlo.

La mia configurazione di assemblaggio originale era così:

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

Dopo un po ‘di tempo di ricerca, lo cambio al seguente e funziona:

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