log.h
Go to the documentation of this file.
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
* Copyright (C) 2018, Google Inc.
*
* log.h - Logging infrastructure
*/
#ifndef __LIBCAMERA_INTERNAL_LOG_H__
#define __LIBCAMERA_INTERNAL_LOG_H__
#include <chrono>
#include <sstream>
#include "libcamera/internal/utils.h"
namespace libcamera {
enum LogSeverity {
LogInvalid = -1,
LogDebug = 0,
LogInfo,
LogWarning,
LogError,
LogFatal,
};
class LogCategory
{
public:
explicit LogCategory(const char *name);
~LogCategory();
const char *name() const { return name_; }
LogSeverity severity() const { return severity_; }
void setSeverity(LogSeverity severity);
static const LogCategory &defaultCategory();
private:
const char *name_;
LogSeverity severity_;
};
#define LOG_DECLARE_CATEGORY(name) \
extern const LogCategory &_LOG_CATEGORY(name)();
#define LOG_DEFINE_CATEGORY(name) \
const LogCategory &_LOG_CATEGORY(name)() \
{ \
static LogCategory category(#name); \
return category; \
}
class LogMessage
{
public:
LogMessage(const char *fileName, unsigned int line,
LogSeverity severity);
LogMessage(const char *fileName, unsigned int line,
const LogCategory &category, LogSeverity severity);
LogMessage(const LogMessage &) = delete;
LogMessage(LogMessage &&);
~LogMessage();
std::ostream &stream() { return msgStream_; }
const utils::time_point &timestamp() const { return timestamp_; }
LogSeverity severity() const { return severity_; }
const LogCategory &category() const { return category_; }
const std::string &fileInfo() const { return fileInfo_; }
const std::string msg() const { return msgStream_.str(); }
private:
void init(const char *fileName, unsigned int line);
std::ostringstream msgStream_;
const LogCategory &category_;
LogSeverity severity_;
utils::time_point timestamp_;
std::string fileInfo_;
};
class Loggable
{
public:
virtual ~Loggable();
protected:
virtual std::string logPrefix() const = 0;
LogMessage _log(const char *file, unsigned int line,
LogSeverity severity) const;
LogMessage _log(const char *file, unsigned int line,
const LogCategory &category,
LogSeverity severity) const;
};
LogMessage _log(const char *file, unsigned int line, LogSeverity severity);
LogMessage _log(const char *file, unsigned int line,
const LogCategory &category, LogSeverity severity);
#ifndef __DOXYGEN__
#define _LOG_CATEGORY(name) logCategory##name
#define _LOG1(severity) \
_log(__FILE__, __LINE__, Log##severity).stream()
#define _LOG2(category, severity) \
_log(__FILE__, __LINE__, _LOG_CATEGORY(category)(), Log##severity).stream()
/*
* Expand the LOG() macro to _LOG1() or _LOG2() based on the number of
* arguments.
*/
#define _LOG_MACRO(_1, _2, NAME, ...) NAME
#define LOG(...) _LOG_MACRO(__VA_ARGS__, _LOG2, _LOG1)(__VA_ARGS__)
#else /* __DOXYGEN___ */
#define LOG(category, severity)
#endif /* __DOXYGEN__ */
#ifndef NDEBUG
#define ASSERT(condition) static_cast<void>(({ \
if (!(condition)) \
LOG(Fatal) << "assertion \"" #condition "\" failed"; \
}))
#else
#define ASSERT(condition) static_cast<void>(false && (condition))
#endif
} /* namespace libcamera */
#endif /* __LIBCAMERA_INTERNAL_LOG_H__ */
libcamera::LogCategory
A category of log message.
Definition: log.h:27
libcamera::LogCategory::name
const char * name() const
Retrieve the log category name.
Definition: log.h:32
libcamera::LogCategory::severity
LogSeverity severity() const
Retrieve the severity of the log category.
Definition: log.h:33
libcamera::LogCategory::defaultCategory
static const LogCategory & defaultCategory()
Retrieve the default log category.
Definition: log.cpp:750
libcamera::LogCategory::LogCategory
LogCategory(const char *name)
Construct a log category.
Definition: log.cpp:707
libcamera::LogCategory::setSeverity
void setSeverity(LogSeverity severity)
Set the severity of the log category.
Definition: log.cpp:737
libcamera::LogMessage
Internal log message representation.
Definition: log.h:54
libcamera::LogMessage::category
const LogCategory & category() const
Retrieve the category of the log message.
Definition: log.h:68
libcamera::LogMessage::LogMessage
LogMessage(const char *fileName, unsigned int line, LogSeverity severity)
Construct a log message for the default category.
Definition: log.cpp:776
libcamera::LogMessage::msg
const std::string msg() const
Retrieve the message text of the log message.
Definition: log.h:70
libcamera::LogMessage::fileInfo
const std::string & fileInfo() const
Retrieve the file info of the log message.
Definition: log.h:69
libcamera::LogMessage::timestamp
const utils::time_point & timestamp() const
Retrieve the timestamp of the log message.
Definition: log.h:66
libcamera::LogMessage::stream
std::ostream & stream()
Definition: log.h:64
libcamera::LogMessage::severity
LogSeverity severity() const
Retrieve the severity of the log message.
Definition: log.h:67
libcamera::Loggable
Base class to support log message extensions.
Definition: log.h:83
libcamera::Loggable::logPrefix
virtual std::string logPrefix() const =0
Retrieve a string to be prefixed to the log message.
libcamera::Loggable::_log
LogMessage _log(const char *file, unsigned int line, LogSeverity severity) const
Create a temporary LogMessage object to log a message.
Definition: log.cpp:926
libcamera::LogSeverity
LogSeverity
Definition: log.h:17
libcamera::LogWarning
@ LogWarning
Definition: log.h:21
libcamera::LogFatal
@ LogFatal
Definition: log.h:23
libcamera::LogError
@ LogError
Definition: log.h:22
libcamera::LogDebug
@ LogDebug
Definition: log.h:19
libcamera::LogInfo
@ LogInfo
Definition: log.h:20
libcamera::_log
LogMessage _log(const char *file, unsigned int line, LogSeverity severity)
Create a temporary LogMessage object to log a message.
Definition: log.cpp:968
utils.h
Miscellaneous utility functions.
libcamera::utils::time_point
std::chrono::steady_clock::time_point time_point
The libcamera time point related to libcamera::utils::clock.
Definition: utils.h:67