48QxLogger::Level levelFromQt(QtMsgType type)
52 return QxLogger::Debug;
54 return QxLogger::Info;
56 return QxLogger::Warning;
58 return QxLogger::Critical;
62 return QxLogger::Fatal;
65char levelLetter(QxLogger::Level level)
72 case QxLogger::Warning:
74 case QxLogger::Critical:
82QString backupName(
const QString &
fileName,
int index)
84 return fileName + QLatin1Char(
'.') + QString::number(index);
92void rotate(LoggerState &s, qint64 pending)
94 if (s.options.maxFileSize <= 0 || s.options.maxBackups <= 0) {
97 if (s.file.size() + pending <= s.options.maxFileSize) {
101 const QString
base = s.options.fileName;
104 for (
int i = s.options.maxBackups; i > 1; --i) {
105 const QString to = backupName(
base, i);
107 QFile::rename(backupName(
base, i - 1), to);
109 QFile::remove(backupName(
base, 1));
110 QFile::rename(
base, backupName(
base, 1));
112 s.file.setFileName(
base);
113 s.file.open(QIODevice::WriteOnly | QIODevice::Append);
116void messageHandler(QtMsgType type,
const QMessageLogContext &context,
const QString &message)
118 QxLogger::write(levelFromQt(type), QString::fromLatin1(context.category ? context.category :
"default"), message);
125 LoggerState &s = state();
126 QMutexLocker locker(&s.mutex);
129 s.previous = qInstallMessageHandler(messageHandler);
134 if (s.file.isOpen()) {
137 if (
options.fileName.isEmpty()) {
138 s.file.setFileName(QString());
142 QDir().mkpath(QFileInfo(
options.fileName).absolutePath());
143 s.file.setFileName(
options.fileName);
144 return s.file.open(QIODevice::WriteOnly | QIODevice::Append);
147void QxLogger::shutdown()
149 LoggerState &s = state();
150 QMutexLocker locker(&s.mutex);
155 if (s.file.isOpen()) {
159 qInstallMessageHandler(s.previous);
160 s.previous =
nullptr;
165bool QxLogger::isEnabled()
167 LoggerState &s = state();
168 QMutexLocker locker(&s.mutex);
172QString QxLogger::fileName()
174 LoggerState &s = state();
175 QMutexLocker locker(&s.mutex);
176 return s.file.isOpen() ? s.file.fileName() : QString();
179void QxLogger::flush()
181 LoggerState &s = state();
182 QMutexLocker locker(&s.mutex);
183 if (s.file.isOpen()) {
188void QxLogger::write(
Level level,
const QLoggingCategory &category,
const QString &message)
190 write(level, QString::fromLatin1(category.categoryName()), message);
193void QxLogger::write(
Level level,
const QString &category,
const QString &message)
195 LoggerState &s = state();
196 QMutexLocker locker(&s.mutex);
198 if (!s.enabled || level < s.options.level) {
202 const QString line = QStringLiteral(
"%1 [%2] %3: %4\n")
203 .arg(QDateTime::currentDateTime().toString(QStringLiteral(
"yyyy-MM-dd HH:mm:ss.zzz")))
204 .arg(QLatin1Char(levelLetter(level)))
208 if (s.options.toConsole) {
209 const QByteArray utf8 = line.toUtf8();
210 std::fwrite(utf8.constData(), 1,
static_cast<size_t>(utf8.size()), stderr);
214 if (s.file.isOpen()) {
215 const QByteArray utf8 = line.toUtf8();
216 rotate(s, utf8.size());