[libcamera-devel] [PATCH 2/3] libcamera: Add initial logger
Kieran Bingham
kieran.bingham at ideasonboard.com
Thu Dec 6 15:24:01 CET 2018
Hi Laurent,
On 04/12/2018 22:11, Laurent Pinchart wrote:
> The logger is based on the ostream API, allowing code to log messages in
> a native way. It automatically logs the time stamp, severity level, file
> name and line number.
>
> Many important features are missing, such as logging to file, logging
> classes, and log filtering based on the severity level, file name and
> class.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Great - I like that it builds in the timestamping and file/line
tracking, (which we might want to have as a verbosity option later).
It's better than not having anything... so lets get it in and let it
develop as we go.
Acked-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> ---
> src/libcamera/include/.keep_empty | 0
> src/libcamera/include/log.h | 38 +++++++++++++++
> src/libcamera/include/utils.h | 12 +++++
> src/libcamera/log.cpp | 81 +++++++++++++++++++++++++++++++
> src/libcamera/meson.build | 5 +-
> 5 files changed, 135 insertions(+), 1 deletion(-)
> delete mode 100644 src/libcamera/include/.keep_empty
> create mode 100644 src/libcamera/include/log.h
> create mode 100644 src/libcamera/include/utils.h
> create mode 100644 src/libcamera/log.cpp
>
> diff --git a/src/libcamera/include/.keep_empty b/src/libcamera/include/.keep_empty
> deleted file mode 100644
> index e69de29bb2d1..000000000000
> diff --git a/src/libcamera/include/log.h b/src/libcamera/include/log.h
> new file mode 100644
> index 000000000000..76acd1520868
> --- /dev/null
> +++ b/src/libcamera/include/log.h
> @@ -0,0 +1,38 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2018, Google Inc.
> + *
> + * log.h - Logging infrastructure
> + */
> +#ifndef __LIBCAMERA_LOG_H__
> +#define __LIBCAMERA_LOG_H__
> +
> +#include <sstream>
> +
> +namespace libcamera {
> +
> +enum LogSeverity {
> + LogInfo,
> + LogWarning,
> + LogError,
> +};
> +
> +class LogMessage
> +{
> +public:
> + LogMessage(const char *fileName, unsigned int line,
> + LogSeverity severity);
> + LogMessage(const LogMessage&) = delete;
> + ~LogMessage();
> +
> + std::ostream& stream() { return msgStream; }
> +
> +private:
> + std::ostringstream msgStream;
> +};
> +
> +#define LOG(severity) LogMessage(__FILE__, __LINE__, Log##severity).stream()
> +
> +};
> +
> +#endif /* __LIBCAMERA_LOG_H__ */
> diff --git a/src/libcamera/include/utils.h b/src/libcamera/include/utils.h
> new file mode 100644
> index 000000000000..3ffa6f4ea591
> --- /dev/null
> +++ b/src/libcamera/include/utils.h
> @@ -0,0 +1,12 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2018, Google Inc.
> + *
> + * utils.h - Miscellaneous utility functions
> + */
> +#ifndef __LIBCAMERA_UTILS_H__
> +#define __LIBCAMERA_UTILS_H__
> +
> +#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
> +
> +#endif /* __LIBCAMERA_UTILS_H__ */
> diff --git a/src/libcamera/log.cpp b/src/libcamera/log.cpp
> new file mode 100644
> index 000000000000..18ccfa32d8b4
> --- /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, ×tamp);
> + 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);
> +}
> +
> +};
> diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
> index 07d9cd448342..fe38f8b2b5b4 100644
> --- a/src/libcamera/meson.build
> +++ b/src/libcamera/meson.build
> @@ -1,4 +1,7 @@
> -sources = ['main.cpp']
> +sources = files([
> + 'log.cpp',
> + 'main.cpp',
> +])
>
> includes = [
> libcamera_includes,
>
--
Regards
--
Kieran
More information about the libcamera-devel
mailing list