C# log4net以编程方式将目标从文本更改为数据库,再更改为事件日志
有没有一种方法可以让log4net通过程序中的某些条件更改预期日志的目标位置,而不必更新和重新部署xml配置 我不想要任何依赖配置的解决方案。它应该完全通过代码工作。我有一些条件,根据这些条件,我可以告诉我的计划选择哪个目标。在某些情况下,程序将自动在预定义路径上的文本文件之间切换,或在预定义服务器/数据库上切换到SQL Server,或在我的应用程序套件名称下切换到事件日志。文件路径、sql连接字符串和事件日志参数将是存储在我的应用程序配置文件中的唯一内容 这在log4net上可行吗?我找不到任何与我搜索的内容相关的内容,因此我还没有任何可以显示的代码。大多数答案都是关于如何更改默认目录位置的,但这不是我想要的C# log4net以编程方式将目标从文本更改为数据库,再更改为事件日志,c#,log4net,log4net-configuration,log4net-appender,log4net-filter,C#,Log4net,Log4net Configuration,Log4net Appender,Log4net Filter,有没有一种方法可以让log4net通过程序中的某些条件更改预期日志的目标位置,而不必更新和重新部署xml配置 我不想要任何依赖配置的解决方案。它应该完全通过代码工作。我有一些条件,根据这些条件,我可以告诉我的计划选择哪个目标。在某些情况下,程序将自动在预定义路径上的文本文件之间切换,或在预定义服务器/数据库上切换到SQL Server,或在我的应用程序套件名称下切换到事件日志。文件路径、sql连接字符串和事件日志参数将是存储在我的应用程序配置文件中的唯一内容 这在log4net上可行吗?我找不到
感谢可以通过编程方式切换每个appender的日志记录。您可以根据定义的条件控制日志记录阈值 例如,这是一些代码,用于切换名称前缀为“Audit”的追加器
我知道您只讨论了在代码中更改appender,但我真的认为使用根据代码中设置的上下文属性选择的appender会让您受益更多 例如,在配置文件中执行以下操作:
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender,log4net">
<filter type="log4net.Filter.PropertyFilter">
<key value="target" />
<stringToMatch value="DB" />
<acceptOnMatch value="true" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<!-- your ado configuration -->
<appender name="AnotherAppender" type="log4net.Appender.EventLogAppender,log4net">
<filter type="log4net.Filter.PropertyFilter">
<key value="target" />
<stringToMatch value="EventLog" />
<acceptOnMatch value="true" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<!-- your Eventlog configuration -->
这样,您的代码中就不会隐藏神奇的日志输出,输出是通过配置驱动的,因此您可以轻松地对其进行更改,而路由是应用程序内部唯一需要注意的事情
如果您不需要每条消息的上下文(例如,您知道一旦日志路由发生更改,它在很长一段时间内不会再次切换),则可以使用可全局设置的其他三种上下文之一:
用于应用程序中的所有记录器log4net.GlobalContext
在同一线程中的记录器之间共享log4net.ThreadContext
ThreadLogicalContext在线程()的相同逻辑边界中的记录器之间共享log4net。
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender,log4net">
<filter type="log4net.Filter.PropertyFilter">
<key value="target" />
<stringToMatch value="DB" />
<acceptOnMatch value="true" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<!-- your ado configuration -->
<appender name="AnotherAppender" type="log4net.Appender.EventLogAppender,log4net">
<filter type="log4net.Filter.PropertyFilter">
<key value="target" />
<stringToMatch value="EventLog" />
<acceptOnMatch value="true" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<!-- your Eventlog configuration -->
var isDB = true;
var loggingEvent = new LoggingEvent(typeof(Program), Log.Logger.Repository, Log.Logger.Name, Level.Info, "message", null);
loggingEvent.Properties["target"] = isDB ? "DB" : "EventLog";
Log.Logger.Log(loggingEvent);