如何在c#中重构log4net语句?
好的,在阅读了danben的答案之后,我想我确信有必要编写这种代码,至少在很多情况下是这样。我的经理们似乎也同意如何在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语
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!");
}
}