【问题标题】:log4net programmatically change target from text to database to event loglog4net 以编程方式将目标从文本更改为数据库到事件日志
【发布时间】:2014-07-14 15:15:20
【问题描述】:

有没有办法让 log4net 通过程序中的某些条件更改预期日志的目标位置,而无需更新和重新部署 xml 配置?

我不想要任何依赖于配置的解决方案。它应该纯粹通过代码工作。我有一定的条件,我可以根据这些条件告诉我的程序选择哪个目标。在某些情况下,程序将自动在预定义路径上的文本文件或预定义服务器/数据库上的 SQL Server 或我的应用程序套件名称下的事件日志之间切换。文件路径、sql 连接字符串和事件日志参数将是唯一存储在我的应用程序配置文件中的内容。

这在 log4net 上是否可行?我找不到与我搜索的内容相关的任何内容,因此我还没有可以显示的任何代码。大多数答案都是关于如何更改默认目录位置,但这不是我想要的。

谢谢

【问题讨论】:

    标签: c# log4net log4net-configuration log4net-appender log4net-filter


    【解决方案1】:

    我知道您谈到仅在代码中更改附加程序,但我真的认为使用根据代码中设置的上下文属性选择的附加程序会使您受益更多

    一个例子是在你的配置文件中做这样的事情:

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

    然后在您的代码中,您可以将记录器target 属性设置为您想要的目的地:

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

    这样您就不会在代码中隐藏神奇的日志输出,输出是通过配置驱动的,因此您可以轻松更改它,并且路由是您在应用程序中唯一需要处理的事情。

    如果您不需要每条消息的上下文(例如,您知道一旦记录路由更改,它将很长时间不会再次切换),您可以使用可以全局设置的其他三个上下文之一:

    • log4net.GlobalContext 用于应用中的所有记录器
    • log4net.ThreadContext 在同一线程中的记录器之间共享
    • log4net.ThreadLogicalContext 在同一线程逻辑边界中的记录器之间共享 (more info on the difference)

    【讨论】:

      【解决方案2】:

      可以以编程方式切换每个附加程序的日志记录。您可以根据定义的条件控制日志记录阈值。

      例如,这是一些切换附加程序的代码,这些附加程序的名称以“Audit”为前缀。

              private static void ToggleAuditing(bool enabled)
          {
              log4net.Appender.IAppender[] appenders = log4net.LogManager.GetRepository().GetAppenders();
      
              foreach (log4net.Appender.IAppender app in appenders)
              {
                  log4net.Appender.AppenderSkeleton skel = app as log4net.Appender.AppenderSkeleton;
      
                  if (skel != null && app.Name.StartsWith("Audit"))
                  {
                      skel.Threshold = enabled ? Level.All : Level.Off;
                  }
              }
          }
      

      【讨论】:

      • 您还需要在每个 appender 上调用 ActivateOptions() 才能使用新配置
      猜你喜欢
      • 2022-01-26
      • 2010-10-17
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      • 2015-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多