C#日志记录的性能技巧

Cha*_*les 5 c# performance logging

我正在研究C#日志记录,如果消息低于日志记录阈值,我不希望我的日志消息花费任何时间进行处理.我可以看到log4net最好的是在评估日志参数后进行阈值检查.

例:

_logger.Debug( "My complicated log message " + thisFunctionTakesALongTime() + " will take a long time" )
Run Code Online (Sandbox Code Playgroud)

即使阈值高于Debug,仍将评估thisFunctionTakesALongTime.

在log4net中,您应该使用_logger.isDebugEnabled,以便最终得到

if( _logger.isDebugEnabled )
    _logger.Debug( "Much faster" )
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更好的.net日志记录解决方案,每次我想记录时都不需要检查.

在C++中,我被允许这样做

LOG_DEBUG( "My complicated log message " + thisFunctionTakesALongTime() + " will take no time" )
Run Code Online (Sandbox Code Playgroud)

因为我的LOG_DEBUG宏执行日志级别检查.这让我在整个应用程序中都有一行日志消息,我更喜欢这个消息.有人知道在C#中复制这种行为的方法吗?

Jef*_*ang 9

如果您可以使用.NET 3.5(C#3.0),则可以使用扩展方法来包装if语句.

所以你可以做相同的"宏":

logger.Log_Debug("Much faster");

logger.Log_Debug(() => { "My complicated log message " + thisFunctionTakesALongTime() + " will take no time" });
Run Code Online (Sandbox Code Playgroud)

通过将检查包装在此方法中:

public class Log4NetExtensionMethods {
    // simple string wrapper
    public void Log_Debug(this log4net.ILog logger, string logMessage) {
        if(logger.isDebugEnabled) {
             logger.Debug(logMessage);
        }
    }

    // this takes a delegate so you can delay execution
    // of a function call until you've determined it's necessary
    public void Log_Debug(this log4net.ILog logger, Func<string> logMessageDelegate) {
        if(logger.isDebugEnabled) {
             logger.Debug(logMessageDelegate());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Jeff:我指的是使用委托进行条件评估与简单布尔检查之间的性能.请参阅下面的答案 - 在未启用日志记录时,使用lambda的性能降低了20%.简单的规则是,如果性能至关重要,请不要使用后期绑定. (2认同)