Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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_Refactoring_Log4net - Fatal编程技术网

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

如何在c#中重构log4net语句?,c#,logging,refactoring,log4net,C#,Logging,Refactoring,Log4net,好的,在阅读了danben的答案之后,我想我确信有必要编写这种代码,至少在很多情况下是这样。我的经理们似乎也同意 if (log.IsDebugEnabled) log.Debug("ZDRCreatorConfig("+rootelem.ToString()+")"); if (log.IsInfoEnabled) log.Info("Reading Configuration . . ."); 它的问题是,看到所有这些if语句都放在任何地方,只是为了做一个简单的log语

好的,在阅读了danben的答案之后,我想我确信有必要编写这种代码,至少在很多情况下是这样。我的经理们似乎也同意

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#中不支持宏。我们能做什么

更新: 谢谢你的回复,我没有忘记这一条;这只是我名单上的低优先级而已。一旦我有点被抓住了,我就会着手去做,并给出答案。谢谢

另一个更新:

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

一个简单的解决方案是使用lambda表达式有效地将消息生成推迟到需要时(如果需要):

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

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


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

如果您像建议的那样使用LogHelper函数,您将失去记录呼叫站点信息的能力

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

你是这样使用它的:

public class MyClass
{
  ILog logger = LogManager.GetLogger(<blah blah>);
  public void MyFunc()
  {
    logger.Info("Hello!");
  }
}
公共类MyClass
{
ILog logger=LogManager.GetLogger();
public void MyFunc()
{
logger.Info(“你好!”);
}
}
如果启用了“调用站点”日志记录,则调用站点信息将来自帮助器类:LogHelper.Info,而不是真实的类MyClass.MyFunc


如果您不依赖于记录呼叫站点信息,这可能没有多大关系。

好的,我会在有机会时尝试一下,并告诉您我有多喜欢它。你几乎回答了我所有的问题。。。。我很感激!!哈哈,这不是这个问题的主题,但是你用什么样的单元测试框架来测试网络呢?不幸的是,我的公司没有为他们的网络项目进行单元测试,我将开始把它们放在那里。谢谢。@cchampion:我个人使用NUnit,但是有很多选择。谢谢,我当时真的认为可能是这样。我会在有机会的时候读到,稍后在这里更新。你试过NLog吗?IMO NLog往往比Log4Net更干净。
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!");
  }
}