我有一个在远程嵌入式目标系统上运行的 QtQuick/QML 应用程序。我在目标上配置了 syslog,以将日志消息定向到日志服务器。
现在,我希望将标准输出和错误控制台输出也重定向到本地系统日志,以便我可以在一处获取所有应用程序反馈。
是否有“最佳实践”方法可以做到这一点?或者我是否想要/需要在我的应用程序中获取所有这些输出并通过“正常通道”记录它?
编辑:我可以根据这个问题/答案使用 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();
}
从 Qt 5.6 开始,有更简单的选项: 您可以使用
qDebug()
、qInfo()
、qWarning()
和其他 Qt 日志功能,它们会将输出传递到 syslog。
从 Qt 5.6 开始,内置了对 syslog 的支持:您需要
-syslog
(如果您使用buildroot,只需添加BR2_PACKAGE_QT5BASE_SYSLOG=y
)#include <QtGlobal>
qputenv("QT_LOGGING_TO_CONSOLE", QByteArray("0"));
添加到您的程序中,以便输出进入系统日志而不是控制台示例:
#include <QtGlobal>
#include <QByteArray>
int main()
{
// Needed to enable logging to syslog or journald.
qputenv("QT_LOGGING_TO_CONSOLE", QByteArray("0"));
// Send some messages, which should go to syslog/journald.
qDebug("qDebug");
qInfo("qInfo");
qWarning("qWarning");
}
来源: https://www.ics.com/blog/whats-new-qt-560-logging-syslog-and-journald