使用代码配置log4net或NLog的XML

3
最近我在一个项目中工作,其中包括提供集中式配置系统。我们使用WCF、Silverlight、C#等创建分布式服务和客户端系统。其中一件需要配置的事情是日志记录。显然,我们可以通过app.config或单独的日志配置文件来配置log4net或NLog。我们也可以通过代码进行配置。我想看看是否可能通过XML从代码中进行配置。换句话说,想象一下,你在内存中(也许从数据库中读取?)拥有了配置任一日志框架所需的完整XML。它能做到吗?是否可以通过包含正确格式的字符串(在特定日志框架的上下文中)来配置log4net和/或NLog,而不是从文件中读取或通过“传统”的API配置?
我已经想出了如何为这些日志框架中的每一个进行配置。我不确定我们是否会真正使用它,但我想在这里与大家分享一下,以防其他人可能会发现它有用。此外,请随意评论使用此方式配置日志框架的可行性(或不可行性)。
我能想到的两个明显的潜在问题是:
1. 构建有效的XML可能很困难(或在数据库中输入)。我的第一个想法是,定义XML的方式与今天相同。将其放入app.config(或外部配置)文件中,然后运行测试程序以验证XML是否产生了预期的结果。 2. 更新数据库中的XML,然后使程序/服务/任何内容对更改做出反应(例如使用log4net的ConfigureAndWatch选项)可能会很容易或很困难(或不可能)。我对程序或服务如何知道XML已更新的机制不太感兴趣。让我们假设程序将定期检查数据库。鉴于新的XML字符串,重新配置日志框架就很容易。
我将把我的技术作为这个问题的答案发布。

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - juagicre
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字符串,然后按照你所使用的特定日志框架的步骤重复操作即可。


好的,你赢了。编写配置太复杂了。 - IlPADlI
对于NLog版本3.2.0.0,您不能将null作为第二个参数传递;相反,我必须传递一个路径,其中我使用了点“.”。 - Tahir Hassan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接