最近我一直在从事一个项目,除其他外,我们希望提供一个集中式配置系统。我们使用 WCF、Silverlight、C# 等来创建分布式服务和客户端系统。我们想要配置的事情之一是日志记录。显然,我们可以通过 app.config 或单独的日志配置文件来配置 log4net 或 NLog。我们也可以通过代码进行配置。我想看看是否可以通过代码通过 XML 进行配置。换句话说,假设您在内存中(可能是从数据库中读取?)配置任一日志记录框架所需的整个 XML。能做到吗?是否可以通过包含正确形成的字符串(在特定日志框架的上下文中)来配置 log4net 和/或 NLog,而不是从文件中读取或通过“传统”API 配置?
我已经弄清楚如何为每个日志框架做到这一点。我不确定我们是否会真正使用它,但我想我会在这里分享它,以防万一其他人可能会发现它有用。另外,请随意评论以这种方式配置日志框架的建议(或不建议)。
我能想到的两个明显的潜在问题是:
构建有效的 XML(或将其输入数据库)可能很困难。我的第一个猜测是,人们会像今天一样定义 XML。将其放入 app.config(或外部配置)文件中,然后运行测试程序以验证 XML 是否产生预期结果。
更新数据库中的 XML 然后让程序/服务/任何内容对更改做出反应(例如使用 log4net 的 ConfigureAndWatch 选项)有多容易或困难(或不可能)?我对程序或服务如何知道 XML 已更新的机制不感兴趣。我们假设程序将定期检查数据库。给定一个新的 XML 字符串,重新配置日志框架就很容易了。
我将发布我的技术作为这个问题的答案。
在代码中通过 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 字符串,只需针对您正在使用的特定日志记录框架重复这些步骤即可。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)