summaryrefslogtreecommitdiff
path: root/src/libcamera/log.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libcamera/log.cpp')
-rw-r--r--src/libcamera/log.cpp81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/libcamera/log.cpp b/src/libcamera/log.cpp
new file mode 100644
index 00000000..18ccfa32
--- /dev/null
+++ b/src/libcamera/log.cpp
@@ -0,0 +1,81 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2018, Google Inc.
+ *
+ * log.h - Logging infrastructure
+ */
+
+#include <cstdio>
+#include <ctime>
+#include <iomanip>
+#include <string.h>
+
+#include "log.h"
+#include "utils.h"
+
+/**
+ * \file log.h
+ * \brief Logging infrastructure
+ */
+
+namespace libcamera {
+
+/**
+ * \enum LogSeverity
+ * Log message severity
+ * \var Info
+ * Informational message
+ * \var Warning
+ * Warning message, signals a potential issue
+ * \var Error
+ * Error message, signals an unrecoverable issue
+ */
+
+/**
+ * \def LOG(severity)
+ * \brief Log a message
+ *
+ * Return an std::ostream reference to which a message can be logged using the
+ * iostream API. The \a severity controls whether the message is printed or
+ * dropped, depending on the global log level.
+ */
+
+static const char *log_severity_name(LogSeverity severity)
+{
+ static const char * const names[] = {
+ "INFO",
+ "WARN",
+ " ERR",
+ };
+
+ if ((unsigned int)severity < ARRAY_SIZE(names))
+ return names[severity];
+ else
+ return "UNKN";
+}
+
+LogMessage::LogMessage(const char *fileName, unsigned int line,
+ LogSeverity severity)
+{
+ /* Log the timestamp, severity and file information. */
+ struct timespec timestamp;
+ clock_gettime(CLOCK_MONOTONIC, &timestamp);
+ msgStream << "[" << timestamp.tv_sec / (60 * 60) << ":"
+ << std::setw(2) << (timestamp.tv_sec / 60) % 60 << ":"
+ << std::setw(2) << timestamp.tv_sec % 60 << "."
+ << std::setw(9) << timestamp.tv_nsec << "]";
+
+ msgStream << " " << log_severity_name(severity);
+ msgStream << " " << basename(fileName) << ":" << line << " ";
+}
+
+LogMessage::~LogMessage()
+{
+ msgStream << std::endl;
+
+ std::string msg(msgStream.str());
+ fwrite(msg.data(), msg.size(), 1, stderr);
+ fflush(stderr);
+}
+
+};