Ja.
This commit is contained in:
@@ -1,17 +1,36 @@
|
||||
|
||||
#include "utils.h"
|
||||
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonObject>
|
||||
#include <QString>
|
||||
|
||||
#include <chrono>
|
||||
#include <cstdarg>
|
||||
#include <cstdio>
|
||||
#include <vector>
|
||||
|
||||
typedef struct {
|
||||
std::chrono::time_point<std::chrono::system_clock> start;
|
||||
} timer;
|
||||
|
||||
|
||||
|
||||
static int _log_level = LOG_INFO;
|
||||
static timer *_timer = nullptr;
|
||||
|
||||
static QString formattedMessage(const char *format, va_list args)
|
||||
{
|
||||
va_list countArgs;
|
||||
va_copy(countArgs, args);
|
||||
const int length = std::vsnprintf(nullptr, 0, format, countArgs);
|
||||
va_end(countArgs);
|
||||
|
||||
if (length < 0) {
|
||||
return QString::fromUtf8(format);
|
||||
}
|
||||
|
||||
std::vector<char> buffer(static_cast<size_t>(length) + 1);
|
||||
std::vsnprintf(buffer.data(), buffer.size(), format, args);
|
||||
return QString::fromUtf8(buffer.data(), length);
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
int logLevel()
|
||||
@@ -27,27 +46,48 @@ void setLogLevel(int l)
|
||||
const char *logIndicator(int l)
|
||||
{
|
||||
switch(l) {
|
||||
case LOG_ERROR: return "ERROR ";
|
||||
case LOG_INFO: return "INFO ";
|
||||
case LOG_DEBUG: return "DEBUG ";
|
||||
case LOG_WARNING: return "WARNING";
|
||||
case LOG_ERROR: return "error";
|
||||
case LOG_INFO: return "info";
|
||||
case LOG_DEBUG: return "debug";
|
||||
case LOG_WARNING: return "warning";
|
||||
}
|
||||
return "UNKNOWN";
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
void logElapsed()
|
||||
double logElapsedSeconds()
|
||||
{
|
||||
if (_timer == nullptr) {
|
||||
_timer = new timer;
|
||||
_timer->start = std::chrono::system_clock::now();
|
||||
}
|
||||
|
||||
auto c = std::chrono::system_clock::now();
|
||||
auto duration = c - _timer->start;
|
||||
auto milliseconds
|
||||
const auto current = std::chrono::system_clock::now();
|
||||
const auto milliseconds
|
||||
= std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||
duration)
|
||||
current - _timer->start)
|
||||
.count();
|
||||
fprintf(stderr, "%8.3lf: ", milliseconds/ 1000.0);
|
||||
return milliseconds / 1000.0;
|
||||
}
|
||||
|
||||
void logMessage(int level, const char *format, ...)
|
||||
{
|
||||
if (logLevel() < level) {
|
||||
return;
|
||||
}
|
||||
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
const QString message = formattedMessage(format, args);
|
||||
va_end(args);
|
||||
|
||||
QJsonObject object;
|
||||
object.insert(QStringLiteral("topic"), QStringLiteral("webview-backend"));
|
||||
object.insert(QStringLiteral("level"), QString::fromLatin1(logIndicator(level)));
|
||||
object.insert(QStringLiteral("elapsed"), logElapsedSeconds());
|
||||
object.insert(QStringLiteral("message"), message);
|
||||
|
||||
const QByteArray json = QJsonDocument(object).toJson(QJsonDocument::Compact);
|
||||
std::fprintf(stderr, "json:%s\n", json.constData());
|
||||
std::fflush(stderr);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user