log4cplus ConsoleAppender在容器环境中失效问题求助
log4cplus容器化后长循环场景下无日志输出问题
宿主机运行程序时日志输出正常,但容器中运行带无限循环的程序时,log4cplus完全没有日志输出。怀疑是缓冲区未及时刷新导致的:
- 移除无限循环后,程序终止前日志能正常输出,说明log4cplus会在程序结束时做最后一次缓冲区刷新
- 延长sleep时长无法解决问题,但取消注释代码里的
std::cout输出语句后,log4cplus的日志就正常了
最小复现代码
main.cpp
#include <iostream> #include <unistd.h> #include <log4cplus/logger.h> #include <log4cplus/loggingmacros.h> #include <log4cplus/configurator.h> #include <log4cplus/initializer.h> int main(int argc, char **argv) { std::cout << "Sanity Check" << std::endl; auto log4cplus = ::log4cplus::Initializer(); std::string logconfig("log4cplus_configure.ini"); ::log4cplus::PropertyConfigurator::doConfigure(logconfig); auto logger = ::log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("main")); while (true) { LOG4CPLUS_ERROR(logger, "Sleeping..."); // std::cout << "cout sleep..." << std::endl; // 取消注释后日志恢复正常 sleep(1); } return 0; }
log4cplus_configure.ini
log4cplus.rootLogger=INFO, MyConsoleAppender log4cplus.appender.MyConsoleAppender=log4cplus::ConsoleAppender log4cplus.appender.MyConsoleAppender.layout=log4cplus::PatternLayout log4cplus.appender.MyConsoleAppender.layout.ConversionPattern=[%-5p][%d] %m%n
Dockerfile
FROM rockylinux:latest RUN dnf install -y boost-system COPY ./build/sandbox / COPY ./log4cplus_configure.ini / CMD ["/sandbox"]
CMakeLists.txt
cmake_minimum_required(VERSION 3.10) set (CMAKE_CXX_STANDARD 17) # Project executable and library add_executable(sandbox main.cpp) target_link_libraries(sandbox PUBLIC liblog4cplus.a PUBLIC pthread PUBLIC boost_system )
内容的提问来源于stack exchange,提问作者TenderShortGoldenRetriever
相关产品推荐
相关产品推荐

