Qt/QML: 如何将控制台输出重定向到系统日志
Qt/QML: how to redirect console output to syslog
我在远程嵌入式目标系统上有一个 QtQuick/QML 应用程序 运行。我在目标上配置了 syslog 以将日志消息定向到日志服务器。
现在,我希望将标准输出和错误控制台输出也重定向到本地系统日志,这样我就可以在一个地方获得所有应用程序反馈。
是否有“最佳实践”方法来做到这一点?或者我会 want/need 在我的应用程序中获取所有这些输出并通过“正常渠道”记录它吗?
编辑:我可以通过 this question/answer 的 bash 重定向来做到这一点,但如果可能的话,我仍然更愿意从应用程序内部做到这一点。
编辑:我想我应该说得更清楚一点,我不是在询问如何获取通过应用程序日志记录 API 的消息以转到系统日志。如果我的 QtQuick QML 中有错误,Qt 运行时会生成打印到 stderr 的错误和警告消息。我希望将这些消息重定向到系统日志记录工具。
请注意,所有 Qt 和 QML 日志都将通过此通道流式传输。
#include <syslog.h>
#include <QtGlobal>
/// Consider https://linux.die.net/man/3/openlog
/// Qt Log Message handler
static void qtLogMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
QByteArray loc = msg.toUtf8();
switch (type) {
case QtDebugMsg:
syslog (LOG_DEBUG, "%s", loc.constData());
break;
case QtInfoMsg:
syslog (LOG_INFO, "%s", loc.constData());
break;
case QtWarningMsg:
syslog (LOG_WARNING, "%s", loc.constData());
break;
case QtCriticalMsg:
syslog (LOG_CRIT, "%s", loc.constData());
break;
case QtFatalMsg:
syslog (LOG_ERR, "%s", loc.constData());
break;
}
}
int main(int argc, char* argv[])
{
/// When starting the process
openlog("MY_APP_LOG", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_USER);
/// Install Qt Log Message Handler in main.cpp
qInstallMessageHandler(qtLogMessageHandler);
/// The Qt app GUI start can be
QApplication app(argc, argv);
app.exec();
/// When quitting the process
closelog();
}
我在远程嵌入式目标系统上有一个 QtQuick/QML 应用程序 运行。我在目标上配置了 syslog 以将日志消息定向到日志服务器。
现在,我希望将标准输出和错误控制台输出也重定向到本地系统日志,这样我就可以在一个地方获得所有应用程序反馈。
是否有“最佳实践”方法来做到这一点?或者我会 want/need 在我的应用程序中获取所有这些输出并通过“正常渠道”记录它吗?
编辑:我可以通过 this question/answer 的 bash 重定向来做到这一点,但如果可能的话,我仍然更愿意从应用程序内部做到这一点。
编辑:我想我应该说得更清楚一点,我不是在询问如何获取通过应用程序日志记录 API 的消息以转到系统日志。如果我的 QtQuick QML 中有错误,Qt 运行时会生成打印到 stderr 的错误和警告消息。我希望将这些消息重定向到系统日志记录工具。
请注意,所有 Qt 和 QML 日志都将通过此通道流式传输。
#include <syslog.h>
#include <QtGlobal>
/// Consider https://linux.die.net/man/3/openlog
/// Qt Log Message handler
static void qtLogMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
QByteArray loc = msg.toUtf8();
switch (type) {
case QtDebugMsg:
syslog (LOG_DEBUG, "%s", loc.constData());
break;
case QtInfoMsg:
syslog (LOG_INFO, "%s", loc.constData());
break;
case QtWarningMsg:
syslog (LOG_WARNING, "%s", loc.constData());
break;
case QtCriticalMsg:
syslog (LOG_CRIT, "%s", loc.constData());
break;
case QtFatalMsg:
syslog (LOG_ERR, "%s", loc.constData());
break;
}
}
int main(int argc, char* argv[])
{
/// When starting the process
openlog("MY_APP_LOG", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_USER);
/// Install Qt Log Message Handler in main.cpp
qInstallMessageHandler(qtLogMessageHandler);
/// The Qt app GUI start can be
QApplication app(argc, argv);
app.exec();
/// When quitting the process
closelog();
}