Domanda

Ho cercato difficile per i duplicati, ma chiedere quanto segue, non importa quanto sia di base che possa sembrare, per ottenere in chiaro una volta per tutte!

In una console app fresco utilizzando log4net versione 1.2.10.0 su VS28KSP1 a 64 bit W7, ho il seguente codice: -

using log4net;
using log4net.Config;

namespace ConsoleApplication1
{
    class Program
    {
        static readonly ILog _log = LogManager.GetLogger(typeof(Program));
        static void Main(string[] args)
        {
            _log.Info("Ran");
        }
    }
}

Nel mio app.config, ho:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="Program.log" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="1MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="[%username] %date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>

    <root>
      <level value="DEBUG" />
      <appender-ref ref="RollingFileAppender" />
    </root>
  </log4net>

</configuration>

Ciò non scrivere nulla, a meno che non sia aggiungere un attributo:

[ assembly:XmlConfigurator ]

o esplicitamente inizializzare in Main ():

_log.Info("This will not go to the log");
XmlConfigurator.Configure();
_log.Info("Ran");

Ciò solleva le seguenti domande:

  1. Sono quasi certo l'ho visto lavorare da qualche parte su qualche versione log4net senza l'aggiunta dell'attributo montaggio o chiamata in Main. Qualcuno mi può assicurare che non sto immaginando che?
  2. Qualcuno può per favore punto me dove nel documento si afferma esplicitamente che sia la sezione di configurazione e il gancio di inizializzazione sono necessari - si spera con una spiegazione di quando questo è cambiato, se lo ha fatto

Posso facilmente immaginare perché questo potrebbe essere la politica - vista la fase di inizializzazione esplicita per evitare sorprese, ecc, è solo che mi sembra di ricordare questo essere non è sempre il caso ... (e normalmente ho la config nella un file separato, che in genere configSections fuori dal quadro)

È stato utile?

Soluzione

la pagina di configurazione nel manuale :

  

La configurazione log4net può essere configurato mediante assemblaggio attributi a livello piuttosto che specificato livello di programmazione.

     

XmlConfiguratorAttribute: Il log4net.Config.XmlConfiguratorAttribute Consente XmlConfigurator per essere configurato utilizzando le seguenti proprietà:

     
      
  • ConfigFile ...
  •   
  • ConfigFileExtension ...
  •   
     

Se nessuna delle proprietà ConfigFile o ConfigFileExtension vengono specificati, il file di configurazione di applicazione (ad esempio TestApp.exe.config) sarà usato come file di configurazione log4net.

     

Esempio di utilizzo:

// Configure log4net using the .config file
[assembly: log4net.Config.XmlConfigurator(Watch=true)]
// This will cause log4net to look for a configuration file
// called TestApp.exe.config in the application base
// directory (i.e. the directory containing TestApp.exe)
// The config file will be watched for changes.

Sono d'accordo che è un po 'ambigua, ma interpretare l'esistenza di utilizzo ad esempio nel senso che log4net non utilizzerà il file .config senza l'attributo di cui sopra; e il fatto che essi sottolineare che è necessario utilizzare una delle due proprietà, ma non dici nulla tralasciando l'attributo del tutto, mi suggerisce che l'attributo (o chiamata programmatico) è necessario per utilizzare app.config nel come si desidera.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top