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
完成后输出。
我还尝试使用 &>
或 &> | tee
将 myscript
内的标准输出重定向到产生相同结果的日志文件。
如何在这个设置中获取 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;
}
我正在 运行 在网络服务器上创建一个 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
完成后输出。
我还尝试使用 &>
或 &> | tee
将 myscript
内的标准输出重定向到产生相同结果的日志文件。
如何在这个设置中获取 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;
}