动态log4net配置

时间:2014-07-16 14:53:16

标签: c# logging log4net

我的应用程序应支持多种日志记录方案,这些方案可能由环境设置或用户定义的标志提供:

调试 - 由启动参数触发,连接调试器或构建配置设置为 debug < / em>的。活动的appenders: DebugAppender (登录到附加的调试器,如果有的话)。

详细 - 由启动参数触发。 Active appenders:默认,但是appender应该有更具表现力的输出(字符串模式)以获取更多信息

发布 - 由RELEASE构建配置触发。 Active appenders: RollingFlatFileAppender EventLogAppender (因为它是Windows服务)

控制台 - 由启动参数触发。有效的追加器: ColoredConsoleAppender

应该可以混合某些模式,例如Release / Console,Release / Console / Verbose,Debug / Console,Debug / Verbose。

log4net是否支持这样的动态配置?它尝试使用预构建操作提供不同的log4net-config文件,但这仅适用于RELEASE和DEBUG构建配置,不包括启动参数。或者是否有任何其他日志框架可能支持此类方案简单方法? (例如,不在运行时改变app.config,这只是一个PITA)

2 个答案:

答案 0 :(得分:1)

您可以轻松地在代码中配置log4net。这里还有另一个stackoverflow问题,它显示了如何完成:Enable file logging for log4net from code instead of from configuration

我不确定如何附加调试器可以触发Debug配置的激活,但您可以设置Visual Studio在启动时通过Debug - &gt;添加命令行参数。项目设置(Visual Studio)中的命令行选项。

可以通过“#if DEBUG”预处理语句等来切换配置设置,但我只是坚持使用命令行参数来简化构建。

顺便说一下,即使你有一些像Windows服务一样运行而没有问题,你也可以使用控制台appender。

答案 1 :(得分:0)

我将通过提及previous question of yours来重复自己(有点)。就像我之前建议你的那样,我真的建议声明所有的appender,然后根据全局log4net上下文中声明的属性过滤它们。当然,既然你想混合和匹配你的appender你就没有一个属性来做路由,而是x属性,每个属性对应一个appender:

<appender name="ColoredConsoleAppender" 
                        type="log4net.Appender.ColoredConsoleAppender,log4net">

  <filter type="log4net.Filter.PropertyFilter">
    <key value="ConsoleAppenderActive" />
    <stringToMatch value="true" />
    <acceptOnMatch value="true" />
  </filter>
  <filter type="log4net.Filter.DenyAllFilter" />

然后在您的启动代码中设置所有属性:

log4net.GlobalContext.Properties["ConsoleAppenderActive"] = 
                       ParametersContainConsoleAppenderActive ? "true" : "false";

只有调试器的触发器;为此,我在附加调试器时没有发现任何事件触发,因此您可以轮询System.Diagnostics.Debugger.IsAttached值以便在log4net上下文中设置属性。

最后,版本构建可以由#IF DEBUG指令简单地处理。除了轮询之外,每个属性都可以在启动时激活,因此您的日志配置应该具有非常紧密的表面区域。