C# 动态log4net配置
我的应用程序应支持多种记录场景,这些场景可能由环境设置或用户定义的标志给出: 调试-当附加调试器或将生成的配置设置为调试时,由启动参数触发。活动附加程序:DebugAppender(记录到附加的调试器,如果可用) 详细-由启动参数触发。活动附加器:默认设置,但是附加器应该有一个更具表现力的输出(字符串模式)来获取更多信息 发布-由发布版本配置触发。活动附加程序:RollingFlatFileAppender,事件日志附加程序(因为它是Windows服务) 控制台-由启动参数触发。活动追加器:彩色控制台追加器 应该可以混合使用某些模式,例如Release/Console、Release/Console/Verbose、Debug/Console、Debug/VerboseC# 动态log4net配置,c#,logging,log4net,C#,Logging,Log4net,我的应用程序应支持多种记录场景,这些场景可能由环境设置或用户定义的标志给出: 调试-当附加调试器或将生成的配置设置为调试时,由启动参数触发。活动附加程序:DebugAppender(记录到附加的调试器,如果可用) 详细-由启动参数触发。活动附加器:默认设置,但是附加器应该有一个更具表现力的输出(字符串模式)来获取更多信息 发布-由发布版本配置触发。活动附加程序:RollingFlatFileAppender,事件日志附加程序(因为它是Windows服务) 控制台-由启动参数触发。活动追加器:彩色
log4net是否支持这种动态配置?它尝试使用预构建操作来服务不同的log4net配置文件,但是这只适用于发布和调试构建配置,而不包括启动参数。或者是否有其他日志框架可以通过简单的方式支持此类场景?(例如,在运行时不更改app.config,这只是一个PITA)您可以很容易地在代码中配置log4net。这里还有另一个stackoverflow问题,说明了这是如何实现的: 我不确定附加调试器如何触发调试配置的激活,但您可以设置Visual Studio,通过项目设置(Visual Studio)中的调试->命令行选项在启动时添加命令行参数 配置设置可以通过“#if DEBUG”预处理语句等进行切换,但我还是坚持使用命令行参数来简化构建
顺便说一句,你可以使用console appender,即使你的某些东西作为Windows服务运行时没有问题。我将重复我自己(某种程度上)提到的一个问题。正如我之前所建议的,我真的建议声明所有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上下文上设置属性
最后,发布版本可以简单地由
#IF DEBUG
指令处理。除了轮询,每个属性都可以在启动时激活,因此您的日志配置应该有一个非常紧凑的表面积。该链接中的答案看起来并不简单,但似乎是因为log4net的复杂性。我一定会试一试的。附加调试器不会触发任何事件,但在应用程序启动时,我会检查“debugger.IsAttached”以激活“我的调试模式”。当然,您可以始终在运行时使用log4net.Config.XmlConfigurator.Configure()从程序集中的嵌入式资源加载配置
log4net.GlobalContext.Properties["ConsoleAppenderActive"] =
ParametersContainConsoleAppenderActive ? "true" : "false";