代码之家  ›  专栏  ›  技术社区  ›  cchampion

如何重构c#中的log4net语句?

  •  4
  • cchampion  · 技术社区  · 15 年前

    好的,在读了丹本的答案之后 post

    if (log.IsDebugEnabled)
         log.Debug("ZDRCreatorConfig("+rootelem.ToString()+")");
    if (log.IsInfoEnabled)
         log.Info("Reading Configuration . . .");
    

    它的问题是,看到所有这些if语句都放在各处只是为了做一个简单的log语句,我就烦透了。

    我的问题是,我们如何将它重构成一个类,而不再现必须对log方法的参数求值的性能问题?

    简单地将其作为静态方法放入类中是没有帮助的,因为当您传递对象消息时,它仍然需要计算参数:

    public class LogHelper {
         public static Info(ILog log, Object message) {
              if(log.IsInfoEnabled) { log.Info(message); }
         }
    }
    

    显然,C不支持强制方法内联,因此解决方案不可用。C#不支持宏。我们能做什么?!?!

    更新: 谢谢你的回复,我没有忘记这个;这只是我名单上的低优先级而已。一旦我有点上当了,我会着手去做,然后给答案。谢谢


    好。。。我还没仔细看这个问题,你们两个都应该得到正确的答案;但我给了坦泽拉克斯答案,因为我同意,我认为他们会自动内联。他发布的链接很好地说服了我,我现在不应该太担心这个问题,这也是一个很好的笑。我还是会看看那些lambda的东西以后。谢谢你的帮助!

    3 回复  |  直到 7 年前
        1
  •  3
  •   Community CDub    7 年前

    如果static helper方法那么简单,那么它应该自动内联,并具有与之匹配的性能。

    At what level C# compiler or JIT optimize the application code?

        2
  •  15
  •   Phil Ross Matt Johnson-Pint    15 年前

    一个简单的解决方案是使用lambda表达式有效地延迟消息生成,直到需要时为止, 如果

    public static class LogHelper {
        public static void Info(this ILog log, Func<Object> messageProvider) {
            if(log.IsInfoEnabled) { log.Info(messageProvider()); }
        }
    }
    

    称之为:

    log.Info(() => "This is expensive: " + CalculateExpensiveValue());
    
        3
  •  1
  •   wageoghe    14 年前

    只是一个关于静态日志助手函数的注释。。。

    因此,如果您有这样的静态helper类(不考虑延迟消息参数的计算):

    public class LogHelper 
    { 
         public static Info(ILog log, Object message) 
         { 
              if(log.IsInfoEnabled) 
              { 
                log.Info(message); 
              } 
         } 
    } 
    

    public class MyClass
    {
      ILog logger = LogManager.GetLogger(<blah blah>);
      public void MyFunc()
      {
        logger.Info("Hello!");
      }
    }
    

    如果启用了“调用站点”日志记录,则调用站点信息将来自助手类: 而不是你真正的班级 MyClass.MyFunc