FOUND
Loading...
Searching...
No Matches
logging.hpp
Go to the documentation of this file.
1#ifndef LOGGING_H
2#define LOGGING_H
3
5
6// Levels as Numbers (in order of increasing severity)
7#define INFO 0
8#define WARN 1
9#define ERROR 2
10
11#ifdef ENABLE_LOGGING
12
13#include <iostream>
14#include <iomanip>
15#include <string>
16#include <fstream>
17
18// Levels as Strings (in order of increasing severity)
19#define INFO_STR "INFO"
20#define WARN_STR "WARN"
21#define ERROR_STR "ERROR"
22
28#define GET_LEVEL(level) \
29 (level == ERROR ? ERROR_STR : (level == WARN ? WARN_STR : INFO_STR))
30
32
33// LOG_INFO, LOG_WARN and LOG_ERROR
34// should be used within the program
35// (see command-line/parser.cpp for examples)
36
37// Basically, the logging level only allows logs equal
38// to its level and above (in severity) to be printed
39#if LOGGING_LEVEL == INFO
40 #define LOG_INFO(msg) LOG(INFO, msg)
41 #define LOG_WARN(msg) LOG(WARN, msg)
42 #define LOG_ERROR(msg) LOG(ERROR, msg)
43#elif LOGGING_LEVEL == WARN
44 #define LOG_INFO(msg)
45 #define LOG_WARN(msg) LOG(WARN, msg)
46 #define LOG_ERROR(msg) LOG(ERROR, msg)
47#else
48 #define LOG_INFO(msg)
49 #define LOG_WARN(msg)
50 #define LOG_ERROR(msg) LOG(ERROR, msg)
51#endif
52
53namespace found {
54
56
57// The output streams to where the logs go. To override
58// the default streams as shown below, you must define
59// them yourselve above. For instance:
60//
61// // Define the streams as external variable in this file
62// extern std::ofstream log_file;
63// extern std::ofstream err_file;
64//
65// // Then, in logging.cpp (does not exist right now)
66// // Define extern log files, opening in append mode
67// std::ofstream log_file("path/to/logs/found.log", std::ios::app);
68// std::ofstream err_file("path/to/logs/error.log", std::ios::app);
69//
70// #define INFO_STREAM log_file
71// #define WARN_STREAM log_file
72// #define ERROR_STREAM err_file
73//
74#ifndef INFO_STREAM
75#define INFO_STREAM std::cout
76#endif
77#ifndef WARN_STREAM
78#define WARN_STREAM std::cerr
79#endif
80#ifndef ERROR_STREAM
81#define ERROR_STREAM std::cerr
82#endif
83
89#define GET_STREAM(level) \
90 (level == ERROR ? ERROR_STREAM : (level == WARN ? WARN_STREAM : INFO_STREAM))
91
98#define LOG(level, message) { \
99 /* Determine Logging Level */ \
100 const std::string level_string = GET_LEVEL(level); \
101 /* Determine UTC Time */ \
102 std::time_t now = std::time(nullptr); \
103 /* Convert to local time */ \
104 std::tm *local_time = std::localtime(&now); \
105 /* Print out everything */ \
106 GET_STREAM(level) << \
107 "[" << level_string << " " << std::put_time(local_time, "%Y-%m-%d %H:%M:%S %Z") << "] " << \
108 message << std::endl; \
109}
110
111} // namespace found
112
113#else
114
115#define LOG_INFO(msg)
116#define LOG_WARN(msg)
117#define LOG_ERROR(msg)
118
119#endif
120
121#endif // LOGGING_H
Definition calibrate.cpp:7