我为此创建了一个复制样本:
#include <iostream>
#include <QtCore/QLoggingCategory>
#include <QtCore/QDebug>
#include <QtCore/QtCore>
using namespace std;
int main () {
int i;
QLoggingCategory::setFilterRules("*.debug=true\n");
QLoggingCategory LogO(NULL);
if (LogO.isDebugEnabled()) {
cout << "QDebug enabled\n";
} else {
cout << "QDebug disabled!\n";
}
cout << "Start!\n";
qDebug() << "qStart!";
cerr << "print to stderr.\n";
qWarning() << "qWarning";
return 0;
}
构建步骤:
g++ -c -fPIC -I/usr/include/qt5 main.cpp -o main.o
g++ -fPIC main.o -L /usr/lib64 -lQt5Core -o testapp
在交互式外壳中执行应用程序时,输出重定向将按预期方式工作:
设置:
./testapp > out 2> err
输出:
>>cat out:
QDebug enabled
Start!
>>cat err:
qStart!
print to stderr.
qWarning
但是,如果将应用程序作为cronjob执行,则qDebug()和qWarning()的输出丢失将无法正常工作
设置:
* * * * * username /home/username/temp/build/testapp 1> /home/username/temp/log/out 2> /home/username/temp/log/err
输出:
>>cat /home/username/temp/log/out
QDebug enabled
Start!
>>cat home/username/temp/log/err
print to stderr.
环境变量
交互外壳中 env 的输出如下:
LS_COLORS=*long string*
SSH_CONNECTION=*censored*
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
HOSTNAME=*censored*
XDG_SESSION_ID=492
USER=username
SELINUX_ROLE_REQUESTED=
PWD=/home/username/temp/build
HOME=/home/username
SSH_CLIENT=*censored*
SELINUX_LEVEL_REQUESTED=
SSH_TTY=/dev/pts/0
MAIL=/var/spool/mail/username
TERM=xterm
SHELL=/bin/bash
SELINUX_USE_CURRENT_RANGE=
SHLVL=1
LOGNAME=username
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
XDG_RUNTIME_DIR=/run/user/1000
PATH=/usr/lib64/ccache:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/username/.local/bin:/home/username/bin
HISTSIZE=1000
LESSOPEN=||/usr/bin/lesspipe.sh %s
_=/usr/bin/env
OLDPWD=/home/username/temp/build/logs
通过cronjob调用 env 的输出如下:
LS_COLORS=*long string*
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
HOSTNAME=*censored*
XDG_SESSION_ID=995
USER=username
PWD=/home/username
HOME=/home/username
MAIL=/var/spool/mail/username
TERM=xterm
SHELL=/bin/bash
SHLVL=1
LOGNAME=username
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
XDG_RUNTIME_DIR=/run/user/1000
PATH=/usr/lib64/ccache:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/username/.local/bin:/home/username/bin
LESSOPEN=||/usr/bin/lesspipe.sh %s
_=/usr/bin/env
答案 0 :(得分:0)
答案 1 :(得分:0)
问题在于qt的行为有所不同,取决于它是否认为它正在(交互式?)终端中运行。
要注意的一个陷阱:记录的目的地取决于环境变量。如果变量QT_LOGGING_TO_CONSOLE设置为1,则消息功能将始终记录到控制台。如果设置为0,则它们将不会登录到控制台,而是将记录到syslog(如果启用)。如果未设置环境变量,则消息功能将记录到控制台(如果存在)(即,如果程序已连接到终端)。因此,为了确保示例程序的输出进入syslog,我在程序中将环境变量设置为0。
因此,从cron执行时,qDebug,QWarning等的输出不是通过stderr输出,而是直接移交给了 journald 。
TL; DR:快速修复:将QT_LOGGING_TO_CONSOLE=1
添加到 / etc / crontab
。
。
PS:请注意是否需要调试QDebug问题:
QT_LOGGING_DEBUG=1
作为环境变量来制作
qt输出在执行过程中日志记录行为的变化。