3

最近、私は、とりわけ、集中型の構成システムを提供したいプロジェクトに取り組んでいます。WCF、Silverlight、C#などを使用して、サービスとクライアントの分散システムを作成しています。構成したいことの1つは、ロギングです。もちろん、app.configまたは別のログ構成ファイルを介してlog4netまたはNLogを構成できます。コードで設定することもできます。コードからXMLを介して構成できるかどうかを確認したかったのです。言い換えると、いずれかのロギングフレームワークを構成するために必要なXML全体がメモリ内にある(おそらくデータベースから読み取られる)と想像してください。できますか?ファイルからの読み取りや「

私は、これらのロギングフレームワークのそれぞれに対してそれを行う方法を理解しました。実際に使用するかどうかはわかりませんが、他の誰かが役立つと思われる場合に備えて、ここでSOで共有することを考えました。また、この方法でロギングフレームワークを構成することの妥当性(またはそうでないこと)についてコメントしてください。

私が考えることができる2つの明らかな潜在的な問題は次のとおりです。

  1. 有効なXMLを作成する(またはデータベースに入力する)のは難しい場合があります。私の最初の推測は、今日と同じ方法でXMLを定義することです。それをapp.config(または外部構成)ファイルに入れてから、テストプログラムを実行して、XMLが期待どおりの結果をもたらすことを確認します。

  2. データベース内のXMLを更新してから、プログラム/サービス/その他の変更に対応する(log4netのConfigureAndWatchオプションを使用するなど)のはどれほど簡単または困難(または不可能)ですか?私は、プログラムまたはサービスがXMLが更新されたことをどのように認識するかについての仕組みにはあまり興味がありません。プログラムがデータベースを定期的にチェックすると仮定しましょう。新しいXML文字列があれば、ロギングフレームワークを再構成するのは簡単です。

この質問への答えとして私のテクニックを投稿します。

4

1 に答える 1

8

コードでXMLを介してlog4netを構成します。

  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);

コードでXMLを介してNLogを構成します(NLog 2.0以降で機能します)。

  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

NLog 2.0より前では、NLogのXmlLoggingConfigurationオブジェクトはコンストラクターでXmlReaderを取りません。代わりに、次のようにXmlElementを渡すことができます。

  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;

新しいXML文字列を指定して構成を更新するには、使用している特定のロギングフレームワークに対して手順を繰り返すだけです。

于 2010-11-30T18:45:26.223 に答える