1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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);
}
};
|