Conscience Core
conscience_log.h
Go to the documentation of this file.
1 #ifndef LOG_TRACE_ENABLED
2 #define LOG_TRACE_ENABLED
3 #endif
4 
5 #ifndef LOG_DEBUG_ENABLED
6 #define LOG_DEBUG_ENABLED
7 #endif
8 
9 #ifndef LOG_INFO_ENABLED
10 #define LOG_INFO_ENABLED
11 #endif
12 
13 #ifndef CONSCIENCE_LOG_H
14 #define CONSCIENCE_LOG_H
15 
16 #include "os.h"
17 #if CSC_OS_WINDOWS == 1
18  // windows uses a most recent version of spdlog
19 #define CSC_LEVEL_NAME_TRACE spdlog::string_view_t("trace", 5)
20 #define CSC_LEVEL_NAME_DEBUG spdlog::string_view_t("debug", 5)
21 #define CSC_LEVEL_NAME_INFO spdlog::string_view_t("info", 4)
22 #define CSC_LEVEL_NAME_WARNING spdlog::string_view_t("warning", 7)
23 #define CSC_LEVEL_NAME_ERROR spdlog::string_view_t("error", 5)
24 #define CSC_LEVEL_NAME_CRITICAL spdlog::string_view_t("user", 4)
25 #define CSC_LEVEL_NAME_OFF spdlog::string_view_t("off", 3)
26 #define SPDLOG_LEVEL_NAMES \
27  { \
28  CSC_LEVEL_NAME_TRACE, CSC_LEVEL_NAME_DEBUG, CSC_LEVEL_NAME_INFO, \
29  CSC_LEVEL_NAME_WARNING, CSC_LEVEL_NAME_ERROR, CSC_LEVEL_NAME_CRITICAL, \
30  CSC_LEVEL_NAME_OFF \
31  }
32 #endif
33 
34 #include "Util/conscience_util.h"
35 
36 #include "spdlog/spdlog.h"
37 #include <map>
38 #include <string>
39 #include <memory>
40 #include <mutex>
41 
42 using std::string, std::map, std::mutex, std::unique_ptr, std::make_unique;
43 
64 namespace conscience_utils::logging {
65 
66  ENUM(LogLevel,
67  LogLevel_TRACE,
68  LogLevel_DEBUG,
69  LogLevel_INFO,
70  LogLevel_WARN,
71  LogLevel_ERROR,
72  LogLevel_USER
73  );
74 
76  public:
77  inline static const map<string, LogLevel> levelsByName = {
78  {"TRACE", LogLevel_TRACE},
79  {"DEBUG", LogLevel_DEBUG},
80  {"INFO", LogLevel_INFO},
81  {"WARN", LogLevel_WARN},
82  {"ERROR", LogLevel_ERROR},
83  };
84 
86 
90  void setGlobalLoggerLevel(LogLevel level);
91 
95  void setLevelAll(LogLevel level);
96 
101  void setMainFileName(string fileName);
102 
107  const string getMainFileName();
108 
112  const string getLogLinePrefix();
113 
114  private:
115  inline static CscLoggingConfiguration *instance = nullptr;
117 
118  string mainFileName;
119  string logLinePrefix = "(°°) ";
120  };
121 
122  class CscLogger {
123  public:
124  static void globalLog(LogLevel level, string message, bool hilight = false);
125 
126  void setLevel(LogLevel level);
127  void log(LogLevel level, string message, bool hilight = false) const;
128  void trace(string message, bool hilight = false) const;
129  void debug(string message, bool hilight = false) const;
130  void info(string message, bool hilight = false) const;
131  void warn(string message, bool hilight = false) const;
132  void error(string message, bool hilight = false) const;
133  void user(string message, bool hilight = false) const;
134 
135  static unique_ptr<CscLogger> getForCategory(string category);
136  static string getLogDirectory();
137  static string getMainLogFilePath();
138  static void addLogFileOutput(LogLevel minLevel, const string &outPath);
139 
140  static std::shared_ptr<spdlog::logger> getGlobalLogger();
141  static bool isLoggingReady() {
142  return mainLogSink != NULL;
143  }
144  virtual ~CscLogger() = default;
145 
146  bool isLevelEnabled(LogLevel level) const;
147  bool isTraceEnabled() const;
148  bool isDebugEnabled() const;
149  bool isInfoEnabled() const;
150  bool isWarnEnabled() const;
151  bool isErrorEnabled() const;
152  bool isUserEnabled() const;
153 
154  private:
155  CscLogger(std::shared_ptr<spdlog::logger> internalLogger);
156  std::shared_ptr<spdlog::logger> internalLogger;
157 
158  inline static std::shared_ptr<spdlog::sinks::sink> mainLogSink = nullptr;
159  inline static std::shared_ptr<spdlog::logger> globalLogger = nullptr;
160  inline static mutex sinksInitMutex;
161  inline static mutex globalLoggerInitMutex;
162  inline static std::vector<spdlog::sink_ptr> sinks;
163  static std::shared_ptr<spdlog::sinks::sink> getMainLogSink();
164  static std::vector<spdlog::sink_ptr> getSinks();
165  static void doLog(std::shared_ptr<spdlog::logger> logger, LogLevel level, string message, bool hilight);
166  };
167 }
168 
169 #endif
170 
171 using namespace conscience_utils;
172 using namespace conscience_utils::logging;
173 
174 #if defined LOG_INFO_ENABLED
175 #define LOG_INFO(message) CscLogger::globalLog(LogLevel_INFO, message, false);
176 #define LOG_HILIGHT(message) CscLogger::globalLog(LogLevel_INFO, message, true);
177 #else
178 #define LOG_INFO(message)
179 #define LOG_HILIGHT(message)
180 #endif
181 
182 #if defined LOG_DEBUG_ENABLED
183 #define LOG_DEBUG(message) CscLogger::globalLog(LogLevel_DEBUG, message, false);
184 #else
185 #define LOG_DEBUG(message)
186 #endif
187 
188 #if defined LOG_TRACE_ENABLED
189 #define LOG_TRACE(message) CscLogger::globalLog(LogLevel_TRACE, message, false);
190 #else
191 #define LOG_TRACE(message)
192 #endif
193 
194 #define LOG_WARN(message) CscLogger::globalLog(LogLevel_WARN, message, false);
195 #define LOG_ERROR(message) CscLogger::globalLog(LogLevel_ERROR, message, false);
196 #define LOG_USER(message) CscLogger::globalLog(LogLevel_USER, message, false);
197 
198 #define LOGGER_TRACE(message) if (logger->isTraceEnabled()) { logger->trace(message); }
199 #define LOGGER_DEBUG(message) if (logger->isDebugEnabled()) { logger->debug(message); }
200 #define LOGGER_INFO(message) if (logger->isInfoEnabled()) { logger->info(message); }
201 #define LOGGER_WARN(message) if (logger->isWarnEnabled()) { logger->warn(message); }
202 #define LOGGER_ERROR(message) if (logger->isErrorEnabled()) { logger->error(message); }
203 #define LOGGER_USER(message) if (logger->isUserEnabled()) { logger->user(message); }
os.h
conscience_utils::logging::CscLogger::isInfoEnabled
bool isInfoEnabled() const
Definition: conscience_log.cpp:200
conscience_utils::logging::CscLoggingConfiguration::getInstance
static CscLoggingConfiguration * getInstance()
Definition: conscience_log.cpp:60
conscience_utils::logging::CscLogger::user
void user(string message, bool hilight=false) const
Definition: conscience_log.cpp:176
conscience_utils::logging::CscLogger::isErrorEnabled
bool isErrorEnabled() const
Definition: conscience_log.cpp:208
conscience_utils::logging::CscLogger::info
void info(string message, bool hilight=false) const
Definition: conscience_log.cpp:164
conscience_utils::logging::CscLoggingConfiguration::setLevelAll
void setLevelAll(LogLevel level)
Definition: conscience_log.cpp:88
conscience_util.h
conscience_utils::logging::CscLogger::getMainLogFilePath
static string getMainLogFilePath()
Definition: conscience_log.cpp:136
conscience_utils::logging::CscLogger::globalLog
static void globalLog(LogLevel level, string message, bool hilight=false)
Definition: conscience_log.cpp:115
conscience_utils::logging::CscLogger::debug
void debug(string message, bool hilight=false) const
Definition: conscience_log.cpp:160
conscience_utils::logging::CscLogger::error
void error(string message, bool hilight=false) const
Definition: conscience_log.cpp:172
conscience_utils::logging::CscLogger::trace
void trace(string message, bool hilight=false) const
Definition: conscience_log.cpp:156
conscience_utils::logging::CscLogger::getLogDirectory
static string getLogDirectory()
Definition: conscience_log.cpp:143
conscience_utils::logging::CscLoggingConfiguration::setMainFileName
void setMainFileName(string fileName)
Definition: conscience_log.cpp:95
logger
static std::unique_ptr< CscLogger > logger
Definition: gltfHelpers.cpp:6
conscience_utils::logging::CscLogger::warn
void warn(string message, bool hilight=false) const
Definition: conscience_log.cpp:168
conscience_utils::logging::CscLogger::isUserEnabled
bool isUserEnabled() const
Definition: conscience_log.cpp:212
conscience_utils::logging
Definition: conscience_log.cpp:20
conscience_utils::logging::CscLogger::getForCategory
static unique_ptr< CscLogger > getForCategory(string category)
Definition: conscience_log.cpp:119
conscience_utils::logging::CscLogger::isLoggingReady
static bool isLoggingReady()
Definition: conscience_log.h:141
conscience_utils::logging::CscLogger::~CscLogger
virtual ~CscLogger()=default
conscience_utils::logging::CscLogger::addLogFileOutput
static void addLogFileOutput(LogLevel minLevel, const string &outPath)
Definition: conscience_log.cpp:240
conscience_utils
Definition: CscEntityReflexion.h:50
conscience_utils::logging::CscLogger::isWarnEnabled
bool isWarnEnabled() const
Definition: conscience_log.cpp:204
conscience_utils::logging::CscLoggingConfiguration::setGlobalLoggerLevel
void setGlobalLoggerLevel(LogLevel level)
Definition: conscience_log.cpp:81
conscience_utils::logging::CscLogger
Definition: conscience_log.h:122
conscience_utils::logging::CscLogger::isLevelEnabled
bool isLevelEnabled(LogLevel level) const
Definition: conscience_log.cpp:187
conscience_utils::logging::CscLogger::setLevel
void setLevel(LogLevel level)
Definition: conscience_log.cpp:180
conscience_utils::logging::ENUM
ENUM(LogLevel, LogLevel_TRACE, LogLevel_DEBUG, LogLevel_INFO, LogLevel_WARN, LogLevel_ERROR, LogLevel_USER)
conscience_utils::logging::CscLogger::isTraceEnabled
bool isTraceEnabled() const
Definition: conscience_log.cpp:192
conscience_utils::logging::CscLogger::getGlobalLogger
static std::shared_ptr< spdlog::logger > getGlobalLogger()
Definition: conscience_log.cpp:279
conscience_utils::logging::CscLoggingConfiguration::getMainFileName
const string getMainFileName()
Definition: conscience_log.cpp:104
conscience_utils::logging::CscLogger::isDebugEnabled
bool isDebugEnabled() const
Definition: conscience_log.cpp:196
conscience_utils::logging::CscLoggingConfiguration::getLogLinePrefix
const string getLogLinePrefix()
Definition: conscience_log.cpp:111
conscience_utils::logging::CscLoggingConfiguration::levelsByName
static const map< string, LogLevel > levelsByName
Definition: conscience_log.h:77
conscience_utils::logging::CscLoggingConfiguration
Definition: conscience_log.h:75
conscience_utils::logging::CscLogger::log
void log(LogLevel level, string message, bool hilight=false) const
Definition: conscience_log.cpp:152