Boost::log 标准输出仅在从 bash 脚本调用时执行后显示

Boost::log stdout is displayed only after execution when called from bash script

我正在 运行 在网络服务器上创建一个 php 文件,该文件执行 bash 脚本。脚本的标准输出应流式传输到文件,以便客户端可以获取并显示它。

脚本myscript.sh:

#!/bin/bash
echo "-- starting --"
EXE="/home/username/mybinary"
ARGS="/home/username/config.cfg"
PRE="sudo"
$PRE $EXE $ARGS
echo "-- finished --"

调用php:

$fplog = fopen("../bin/log.txt", "w");
if( ($fp = popen("sudo /home/username/src/myscript.sh", "r")) ) {
    while( !feof($fp) ){
        $logline = fgets($fp);
        fwrite($fplog, $logline);
        fflush($fplog);
    }
    fclose($fp);
} else {
    /* error handling */;
}

为什么在执行期间输出没有流式传输到 log.txt

当我在终端中 运行 sudo ./myscript.sh 时,mybinary 的输出在 运行ning 时按预期打印。但是,当我通过 php 调用 myscript 时,我得到的只是 -- starting --。其余的输出只会在 mybinary 完成后输出。

我还尝试使用 &>&> | teemyscript 内的标准输出重定向到产生相同结果的日志文件。

如何在这个设置中获取 mybinary 的标准输出?

编辑:似乎 boost::log 没有在终端中 运行ning 时刷新。我相应地编辑了 post 和标题。

编辑:

boost::log 将在另一个活动时禁用其默认输出流。要避免这种情况,请像这样添加自定义控制台日志:

...
#include <boost/log/utility/setup/console.hpp>
...
boost::log::add_console_log(
    std::cout, /* use stdout */
    boost::log::keywords::auto_flush = true); /* auto flush after each call */

原回答:

mybinary 正在使用 boost::log::trivial,正如我刚刚了解到的那样,当终端中没有 运行 时,它似乎不会刷新其输出。

我的解决方案是直接从 mybinary.

中写入输出

如果有人也在为 boost 日志记录而苦苦挣扎,这是我的解决方案:

#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/utility/setup/file.hpp> //necessary for boost::log::add_file_log
#include <boost/log/utility/setup/common_attributes.hpp> //necessary for formating options (%TimeStamp%, ...)
#include <string>

void initLog(std::string &logFilePath) {
    boost::log::add_common_attributes(); //init %TimeStamp%, etc
    if (!logFilePath.empty()) {
        boost::log::add_file_log(
            boost::log::keywords::file_name = logFilePath.c_str(),
            boost::log::keywords::auto_flush = true, /* flush after each call */
            boost::log::keywords::format = "[%TimeStamp%] [%Severity%]: %Message%"
        );
    }
#ifndef NDEBUG
   boost::log::core::get()->set_filter(boost::log::trivial::severity >= boost::log::trivial::debug);
#else
   boost::log::core::get()->set_filter(boost::log::trivial::severity >= boost::log::trivial::info);
#endif
}

int main() {
    std::string logFilePath;
    if (argc > 1) {
       logFilePath = argv[1];
    }

    initLog(logFilePath);

    BOOST_LOG_TRIVIAL(info) << "Running mybinary with logFile: " << logFilePath;

    return EXIT_SUCCESS;
}