__func_和日志记录
__func__ and logging
我正在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提到的,这是一种典型的方式,在这种情况下,我想不出任何方法可以避免宏。
- 如何实现具有多个平台__FILE__和__LINE__信息的 C/C++ 可变参数日志记录宏?
- C++ 中混合二进制/文本日志记录的最佳做法
- 轻松日志记录++如何避免多个初始化
- 使用字符串流加速 std::cout 日志记录
- 我的游戏引擎的 spdlog 日志记录出现奇怪的"unresolved external symbol"错误
- 从动态加载的库中记录日志
- 使用 #define 进行跟踪日志记录以避免性能问题
- 如何在代码中启用/禁用 spdlog 日志记录?
- 我正在尝试用 c++ 制作一个日志记录框架,但信息没有传递给记录器的子组件,我做错了什么?
- 使用 Python、ROS 和 C++ 进行日志记录
- C++日志记录类实例标识符
- 如何在C++中重载<<线程安全日志记录的运算符?
- 在 C++17 中将无限参数传递给日志记录函数
- 配置 log4cpp 日志记录级别优先级
- C++同时记录到控制台和日志文件
- 如何使用 Boost V2 1.70 日志记录库在第一个索引(例如 logtrail01.txt)保留最新的日志文件名?
- 如何将日志记录写入Visual Studio输出窗口?
- 使用现有日志记录库 (C++) 限制日志大小
- Log4cpp重复记录日志
- 当触发异常时,应该如何记录日志