c++containerslog4jlog4cplus

log4cplus ConsoleAppender does not work in container


I'm trying to containerize my application but I'm having trouble getting log4cplus working. Bottom line up front, logging works when running on the host, but not in the container when I'm logging from long running loops. Its seems like a buffer somewhere is not getting flushed. A minimal example follows.

Additionally, removing the long lived loop removes the issue, presumably log4cplus flushes one last time before tearing down. Lengthening the sleep duration did not seem to help.

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; // uncomment to get log messages working
        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
)

Solution

  • Not sure why, but adding log4cplus.appender.MyConsoleAppender.ImmediateFlush=true to log4cplus_configure.ini solved my issue.