Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态log4net配置_C#_Logging_Log4net - Fatal编程技术网

C# 动态log4net配置

C# 动态log4net配置,c#,logging,log4net,C#,Logging,Log4net,我的应用程序应支持多种记录场景,这些场景可能由环境设置或用户定义的标志给出: 调试-当附加调试器或将生成的配置设置为调试时,由启动参数触发。活动附加程序:DebugAppender(记录到附加的调试器,如果可用) 详细-由启动参数触发。活动附加器:默认设置,但是附加器应该有一个更具表现力的输出(字符串模式)来获取更多信息 发布-由发布版本配置触发。活动附加程序:RollingFlatFileAppender,事件日志附加程序(因为它是Windows服务) 控制台-由启动参数触发。活动追加器:彩色

我的应用程序应支持多种记录场景,这些场景可能由环境设置或用户定义的标志给出:

调试-当附加调试器或将生成的配置设置为调试时,由启动参数触发。活动附加程序:DebugAppender(记录到附加的调试器,如果可用)

详细-由启动参数触发。活动附加器:默认设置,但是附加器应该有一个更具表现力的输出(字符串模式)来获取更多信息

发布-由发布版本配置触发。活动附加程序:RollingFlatFileAppender事件日志附加程序(因为它是Windows服务)

控制台-由启动参数触发。活动追加器:彩色控制台追加器

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


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