2010-11-30 8 views
4

Récemment, j'ai travaillé sur un projet où, entre autres choses, nous voulons fournir un système de configuration centralisé. Nous utilisons WCF, Silverlight, C#, etc. pour créer un système distribué de services et de clients. L'une des choses que nous voudrons configurer est la journalisation. Évidemment, nous pouvons configurer log4net ou NLog via app.config ou via un fichier de configuration de journalisation séparé. Nous pouvons également configurer via le code. Je voulais voir s'il était possible de configurer via XML à partir du code. En d'autres termes, imaginez que vous ayez en mémoire (peut-être lu à partir d'une base de données?) Le code XML complet requis pour configurer l'un ou l'autre des cadres de journalisation. Peut-il être fait? Est-il possible de configurer log4net et/ou NLog via une chaîne contenant un formulaire correctement formé (dans le contexte de la structure de journalisation particulière) par opposition à la lecture du fichier ou via une configuration API "classique"? J'ai trouvé comment faire pour chacun de ces cadres de journalisation. Je ne suis pas sûr que nous allons l'utiliser, mais je pensais que je le partagerais ici sur SO, juste au cas où quelqu'un d'autre pourrait le trouver utile. Aussi, n'hésitez pas à commenter l'opportunité (ou non) de configurer les frameworks de journalisation de cette façon.Configurer log4net ou NLog avec XML à partir du code

Deux évidentes problèmes potentiels que je peux penser sont:

  1. Il pourrait être difficile de construire XML valide (ou entrer dans la base de données). Ma première hypothèse est que l'on pourrait définir le XML de la même façon que l'on le ferait aujourd'hui. Placez-le dans un fichier app.config (ou un fichier de configuration externe), puis exécutez un programme de test pour vérifier que le fichier XML génère les résultats attendus. Comment facile ou difficile (ou impossible) sera-t-il de mettre à jour le XML dans la base de données et d'avoir le programme/service/tout ce qui réagit à la modification (comme l'utilisation de l'option ConfigureAndWatch de log4net)? Je ne suis pas aussi intéressé par la façon dont un programme ou un service sait que le XML a été mis à jour. Supposons simplement que le programme vérifiera la base de données périodiquement. Étant donné une nouvelle chaîne XML, il est assez facile de reconfigurer les cadres de journalisation.

Je vais poster ma technique comme une réponse à cette question.

+0

La solution trouvée [ici] (http://stackoverflow.com/questions/16336917/can-you-configure-log4net-in-code-instead-of-using-a-config-file) est beaucoup plus propre. – juagicre

Répondre

9

Configurer log4net via XML dans le code:

string xml = 
    @"<log4net> 
    <appender name='file1' type='log4net.Appender.RollingFileAppender'> 
     <!-- Log file locaation --> 
     <param name='File' value='log4net.log'/> 
     <param name='AppendToFile' value='true'/> 
     <!-- Maximum size of a log file --> 
     <maximumFileSize value='2KB'/> 
     <!--Maximum number of log file --> 
     <maxSizeRollBackups value='8'/> 
     <!--Set rolling style of log file --> 
     <param name='RollingStyle' value='Composite'/> 
     <param name='StaticLogFileName' value='false'/> 
     <param name='DatePattern' value='.yyyy-MM-dd.lo\g'/> 
     <layout type='log4net.Layout.PatternLayout'> 
     <param name='ConversionPattern' value='%d [%t] %-5p %m%n'/> 
     </layout> 
    </appender> 

    <!-- Appender layout fix to view in console--> 
    <appender name='console' type='log4net.Appender.ConsoleAppender'> 
     <layout type='log4net.Layout.PatternLayout'> 
     <param name='Header' value='[Header]\r\n'/> 
     <param name='Footer' value='[Footer]\r\n'/> 
     <param name='ConversionPattern' value='%d [%t] %-5p %m%n'/> 
     </layout> 
    </appender> 

    <appender name='debug' type='log4net.Appender.DebugAppender'> 
     <layout type='log4net.Layout.PatternLayout'> 
     <param name='ConversionPattern' value='%d [%t] %logger %-5p %m%n'/> 
     </layout> 
    </appender> 
    <root> 
     <level value='INFO'/> 
     <!-- 
      Log level priority in descending order: 

      FATAL = 1 show log -> FATAL 
      ERROR = 2 show log -> FATAL ERROR 
      WARN = 3 show log -> FATAL ERROR WARN 
      INFO = 4 show log -> FATAL ERROR WARN INFO 
      DEBUG = 5 show log -> FATAL ERROR WARN INFO DEBUG 
      --> 
     <!-- To write log in file --> 
     <appender-ref ref='debug'/> 
     <appender-ref ref='file1'/> 
    </root> 

    </log4net>"; 

    XmlDocument doc = new XmlDocument(); 
    doc.LoadXml(xml); 

    log4net.Config.XmlConfigurator.Configure(doc.DocumentElement); 

Configurer NLog via XML en code (fonctionne pour NLog 2.0 et versions ultérieures):

string xml = @"<nlog> 
        <targets> 
        <target name='console' type='Console' layout='${message}' /> 
        </targets> 

        <rules> 
        <logger name='*' minlevel='Error' writeTo='console' /> 
        </rules> 
       </nlog>"; 

    StringReader sr = new StringReader(xml); 
    XmlReader xr = XmlReader.Create(sr); 
    XmlLoggingConfiguration config = new XmlLoggingConfiguration(xr, null); 
    LogManager.Configuration = config; 
    //NLog is now configured just as if the XML above had been in NLog.config or app.config 

Avant NLog 2.0, l'objet XmlLoggingConfiguration de NLog ne le fait pas Prenez un XmlReader dans son constructeur. Vous pouvez passer une place XmlElement, comme ceci:

string xml = @"<nlog> 
       <targets> 
       <target name='debugger' type='Console' layout='${message}' /> 
       </targets> 

       <rules> 
       <logger name='*' minlevel='Error' writeTo='console' /> 
       </rules> 
      </nlog>"; 

    XmlDocument doc = new XmlDocument(); 
    doc.LoadXml(xml); 

    XmlLoggingConfiguration config = new XmlLoggingConfiguration(doc.DocumentElement,null); 
    LogManager.Configuration = config; 

Pour mettre à jour la configuration, étant donné une nouvelle chaîne XML, il suffit de répéter les étapes pour le cadre de l'exploitation forestière particulière que vous utilisez.

+0

Ok, vous gagnez. Coder pour le configurer trop complexe. – IlPADlI

+0

Pour NLog version 3.2.0.0, vous ne pouvez pas passer 'null' comme deuxième argument; au lieu de cela j'ai dû passer dans un chemin, pour lequel j'ai utilisé le point '". "'. –

Questions connexes