C++中如何使用带log_callback回调的enable_log接口获取调试日志
解决方案
1 修正Dummy类模拟实现
首先需要让Dummy类的enable_log接口完全对齐真实类A的定义,你之前报错的核心原因是错把函数指针类型的入参写成了const std::string&,且const引用本身不允许被赋值。
正确的模拟实现代码如下:
#include <string> // 对齐真实头文件中的回调定义 using log_callback = void (*)(const std::string& message, void* user_data); class DummyA { private: log_callback m_callback = nullptr; void* m_user_data = nullptr; public: // 完全对齐真实接口的enable_log void enable_log(log_callback callback, void* user_data = nullptr) { m_callback = callback; m_user_data = user_data; } // 模拟类A内部生成日志的逻辑,真实场景下这部分是类A原有代码自带的 void trigger_log_for_test(const std::string& test_msg) { if (m_callback) { m_callback(test_msg, m_user_data); } } };
2 业务侧调用实现
不需要修改原有类的任何代码,只需要在业务侧自定义回调函数,通过user_data参数传递你在main中声明的字符串指针,即可实现日志内容的捕获:
#include <iostream> // 自定义回调函数,逻辑完全由业务侧实现 void my_log_handler(const std::string& message, void* user_data) { // 将user_data强转为我们传入的字符串指针,写入日志内容 std::string* output_buf = static_cast<std::string*>(user_data); if (output_buf) { *output_buf = message; } } int main() { DummyA a; // 你要存储日志的空字符串 std::string log_content; // 注册回调,把字符串的指针作为user_data传入 a.enable_log(my_log_handler, &log_content); // 模拟类A内部生成日志的动作,真实场景下这一步是类A运行时自动触发的 a.trigger_log_for_test("ABCD: 测试诊断日志"); // 直接输出捕获到的日志 std::cout << "捕获到的日志:" << log_content << std::endl; // 真实场景下你可以直接用这个log_content做后续分析,比如写入崩溃转储的附属日志文件 return 0; }
真实项目适配说明
真实Linux环境下的类A不需要做任何修改,你只需要把上述代码中的DummyA替换为你的类A即可:类A内部生成日志时会自动调用你注册的my_log_handler,把诊断日志写入你指定的字符串中,你可以在崩溃前把捕获到的所有日志写入磁盘,辅助定位core dump原因。
内容的提问来源于stack exchange,提问作者csharp
相关产品推荐
相关产品推荐

