__func_和日志记录

__func__ and logging

本文关键字:记录 日志 func      更新时间:2023-10-16

我正在C++中实现一个日志处理程序,它运行良好,但有一件事我觉得可用,那就是记录器从哪里获得输出。

我想这并不是什么大问题,但我偶然发现了__func__标识符,它基本上会保留当前函数的函数名。

因此,在我的Log类中有一个名为Write的静态函数,它需要一个日志级别和一个不同的列表。所以我会这样称呼它:

Log::Write(LOG_DEBUG, "this is an integer: %d", 10);

它将打印:

2013-01-02 => 10:12:01.366 [DEBUG]: this is an integer: 10

然而,我认为在消息中也有呼叫者可能会很有用,可以产生这样的东西:

2013... => 10:12:... (functionName) [DEBUG]: blah

因此,我能做的(当然(是将__func__作为参数添加到Log::Write中,但这意味着,每当我调用Log::Write时,我都需要发送__func__,它将始终相同,我觉得应该可以在不明确表示的情况下这样做。

所以我想要的是提供的功能:

Log::Write(LOG_DEBUG, __func__, "message");

而不需要每次都显式地键入func

我不知道这是否真的可能,我得到的最好的选择是,有某种方法可以在函数Write内部取消引用调用方,我似乎不太可能只是"推断"这样的参数。但至少值得一问,也许我能看到有什么选择。

谢谢。

这通常与宏以及文件名__FILE__和行号__LINE__一起完成。

void Log::Write(Level l,
                char const* function,
                char const* file,
                int line,
                char const* format,
                ...);

被包装到一个宏中:

#define LOG(Level_, Format_, ...) 
    Log::Write(Level_, __func__, __FILE__, __LINE__, Format_, __VA_ARGS__);

请注意,您可能想通过检查是否以该级别登录来"保存"一些计算:

// suppose availability of "bool Log::Enabled(Level l)"
#define LOG(Level_, Format_, ...)   
    while (Log::Enabled(Level_)) {  
      Log::Write(Level_, __func__, __FILE__, __LINE__, Format_, __VA_ARGS__);  
      break;  
    }

使用while而不是if是为了避免挂起其他问题。

注意:您可能希望调查流用于日志记录的使用情况。printf样式的问题在于它不可组合。使用流,您可以为任何X重载std::ostream& operator<<(std::ostream&, X const&),然后只写一次一个方法来将其内容转储到日志中

#define WRITE_LOG(X,...) Log::Write(LOG_DEBUG, __func__, (X),__VA_ARGS__);

使用此宏来写入日志,而不是函数,它将自动添加func参数。正如Mat提到的,这是一种典型的方式,在这种情况下,我想不出任何方法可以避免宏。