我创建了一个使用 Abseil 的简单项目,并在 Qt Creator 中构建和运行。
当我使用任何下降记录时,我会在 Qt Creator 的“应用程序输出”窗格中看到两次输出。一次为红色,一次为白色(我使用的是深色主题)。使用
std::cout
,我看到输出一次为白色,正如预期的那样。使用 std::cerr
,我看到输出一次为红色,正如预期的那样。我不知道如何阻止 Abseil 记录打印两次。如果我从命令行运行相同的进程,则 Abseil 日志只会按预期打印到 stderr。
Abseil 最近在本地克隆为子目录。提交是
2a636651729cec997a433ce8e363c6344130944e
,尽管旧版本也会发生这种情况。
目录结构如下:
.
|-- CMakeLists.txt
|-- CMakeLists.txt.user
|-- abseil-cpp
`-- main.cpp
这是我的主要内容:
#include <absl/log/globals.h>
#include <absl/log/initialize.h>
#include <absl/log/log.h>
#include <iostream>
int main() {
absl::InitializeLog();
absl::SetStderrThreshold(absl::LogSeverityAtLeast::kInfo);
std::cout << "Cout test" << std::endl;
std::cerr << "Cerr test" << std::endl;
LOG(INFO) << "test";
return 0;
}
该程序将打印类似以下内容:
Cout test
Cerr test
I0104 17:58:48.312991 20796 main.cpp:12] test
I0104 17:58:48.312991 20796 main.cpp:12] test
(“Cerr test”和“main.cpp:12] test”行之一为红色)
这是我的 CMakeLists.txt:
cmake_minimum_required(VERSION 3.26.4)
project(main LANGUAGES CXX)
add_executable(${PROJECT_NAME}
main.cpp
)
set(ABSL_PROPAGATE_CXX_STD ON)
add_subdirectory(abseil-cpp)
target_link_libraries(${PROJECT_NAME}
PUBLIC
absl::log
absl::log_initialize
)
这已被确定为 Qt Creator 中的一个错误。我想出了一个解决方法。我创建了自己的“Log Sink”并用绳索注册了它。
class MyLogSink : public absl::LogSink {
public:
void Send(const absl::LogEntry& entry) override {
std::cerr << entry.text_message_with_prefix_and_newline();
}
};
absl::LogSink *mySink = new MyLogSink;
absl::AddLogSink(mySink);
此外,
LogSeverity
级别应设置为最大值以禁用通常的ABSL日志记录。
absl::SetStderrThreshold(absl::LogSeverityAtLeast::kInfinity);