Leosac  0.7.0
OpenSourceAccessControl
log.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2014-2016 Leosac
3 
4  This file is part of Leosac.
5 
6  Leosac is free software: you can redistribute it and/or modify
7  it under the terms of the GNU Affero General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  Leosac is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU Affero General Public License for more details.
15 
16  You should have received a copy of the GNU Affero General Public License
17  along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #pragma once
21 
22 #include <cassert>
23 #include <csignal>
24 #include <iostream>
25 #include <spdlog/spdlog.h>
26 #include <sstream>
27 #include <string>
28 
30 {
31  EMERG = spdlog::level::emerg,
32  ALERT = spdlog::level::alert,
33  CRIT = spdlog::level::critical,
34  ERROR = spdlog::level::err,
35  WARN = spdlog::level::warn,
36  NOTICE = spdlog::level::notice,
37  INFO = spdlog::level::info,
38  DEBUG = spdlog::level::debug,
39 };
40 
41 namespace LogHelper
42 {
43 LogLevel log_level_from_string(const std::string &level);
44 
45 void log(const std::string &log_msg, int /*line*/, const char * /*funcName*/,
46  const char * /*fileName*/, LogLevel level);
47 };
48 
55 #ifdef __GNUC__
56 #define FUNCTION_NAME_MACRO __PRETTY_FUNCTION__
57 #else
58 #define FUNCTION_NAME_MACRO __FUNCTION__
59 #endif
60 
66 #define BUILD_STR(param) \
67  [&](void) { \
68  std::stringstream logger_macro_ss__; \
69  logger_macro_ss__ << param; \
70  return logger_macro_ss__.str(); \
71  }()
72 
73 
77 #define DEBUG_0(msg) \
78  LogHelper::log(BUILD_STR(msg), __LINE__, FUNCTION_NAME_MACRO, __FILE__, \
79  LogLevel::DEBUG)
80 
84 #define DEBUG_1(msg, loggers) \
85  LogHelper::log(BUILD_STR(msg), __LINE__, FUNCTION_NAME_MACRO, __FILE__, \
86  LogLevel::DEBUG, loggers)
87 
91 #define DEBUG_X(trash, msg, loggers, targetMacro, ...) targetMacro
92 
97 #define DEBUG(...) \
98  DEBUG_X(, ##__VA_ARGS__, DEBUG_1(__VA_ARGS__), DEBUG_0(__VA_ARGS__), \
99  DEBUG_NO_PARAM(__VA_ARGS__), )
100 
101 
105 #define INFO_0(msg) \
106  LogHelper::log(BUILD_STR(msg), __LINE__, FUNCTION_NAME_MACRO, __FILE__, \
107  LogLevel::INFO)
108 
112 #define INFO_1(msg, loggers) \
113  LogHelper::log(BUILD_STR(msg), __LINE__, FUNCTION_NAME_MACRO, __FILE__, \
114  LogLevel::INFO, loggers)
115 
119 #define INFO_X(trash, msg, loggers, targetMacro, ...) targetMacro
120 
125 #define INFO(...) \
126  INFO_X(, ##__VA_ARGS__, INFO_1(__VA_ARGS__), INFO_0(__VA_ARGS__), \
127  INFO_NO_PARAM(__VA_ARGS__), )
128 
129 
133 #define NOTICE_0(msg) \
134  LogHelper::log(BUILD_STR(msg), __LINE__, FUNCTION_NAME_MACRO, __FILE__, \
135  LogLevel::NOTICE)
136 
140 #define NOTICE_1(msg, loggers) \
141  LogHelper::log(BUILD_STR(msg), __LINE__, FUNCTION_NAME_MACRO, __FILE__, \
142  LogLevel::NOTICE, loggers)
143 
147 #define NOTICE_X(trash, msg, loggers, targetMacro, ...) targetMacro
148 
153 #define NOTICE(...) \
154  NOTICE_X(, ##__VA_ARGS__, NOTICE_1(__VA_ARGS__), NOTICE_0(__VA_ARGS__), \
155  NOTICE_NO_PARAM(__VA_ARGS__), )
156 
157 
161 #define WARN_0(msg) \
162  LogHelper::log(BUILD_STR(msg), __LINE__, FUNCTION_NAME_MACRO, __FILE__, \
163  LogLevel::WARN)
164 
168 #define WARN_1(msg, loggers) \
169  LogHelper::log(BUILD_STR(msg), __LINE__, FUNCTION_NAME_MACRO, __FILE__, \
170  LogLevel::WARN)
171 
175 #define WARN_X(trash, msg, loggers, targetMacro, ...) targetMacro
176 
181 #define WARN(...) \
182  WARN_X(, ##__VA_ARGS__, WARN_1(__VA_ARGS__), WARN_0(__VA_ARGS__), \
183  WARN_NO_PARAM(__VA_ARGS__), )
184 
185 
189 #define ERROR_0(msg) \
190  LogHelper::log(BUILD_STR(msg), __LINE__, FUNCTION_NAME_MACRO, __FILE__, \
191  LogLevel::ERROR)
192 
196 #define ERROR_1(msg, loggers) \
197  LogHelper::log(BUILD_STR(msg), __LINE__, FUNCTION_NAME_MACRO, __FILE__, \
198  LogLevel::ERROR)
199 
203 #define ERROR_X(trash, msg, loggers, targetMacro, ...) targetMacro
204 
209 #define ERROR(...) \
210  ERROR_X(, ##__VA_ARGS__, ERROR_1(__VA_ARGS__), ERROR_0(__VA_ARGS__), \
211  ERROR_NO_PARAM(__VA_ARGS__), )
212 
213 
214 #ifdef NDEBUG
215 #define ASSERT_LOG(cond, msg) \
216  do \
217  { \
218  (void)sizeof(cond); \
219  } while (0)
220 #else
221 #define ASSERT_LOG(cond, msg) \
222  do \
223  { \
224  if (!(cond)) \
225  { \
226  ERROR(msg); \
227  ERROR("Assertion failed in " << __FILE__ << " --> " \
228  << FUNCTION_NAME_MACRO << ":" << __LINE__ \
229  << ". Aborting."); \
230  raise(SIGABRT); \
231  } \
232  } while (false)
233 #endif
Definition: log.hpp:32
#define WARN(...)
Warning macro.
Definition: log.hpp:181
Definition: log.hpp:33
Definition: log.hpp:31
#define NOTICE(...)
Notice macro.
Definition: log.hpp:153
LogLevel
Definition: log.hpp:29
#define INFO(...)
Information macro.
Definition: log.hpp:125
#define ERROR(...)
Error macro.
Definition: log.hpp:209
void log(const std::string &log_msg, int, const char *, const char *, LogLevel level)
Definition: log.cpp:47
#define DEBUG(...)
Debug macro.
Definition: log.hpp:97
LogLevel log_level_from_string(const std::string &level)
Definition: log.cpp:118