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 #include "spdlog/spdlog.h"
36 #include <map>
37 #include <string>
38 #include <memory>
39 #include <mutex>
40 
41 using std::string, std::map, std::mutex, std::unique_ptr, std::make_unique;
42 
63 namespace conscience_utils::logging {
64 
65  ENUM(LogLevel,
66  LogLevel_TRACE,
67  LogLevel_DEBUG,
68  LogLevel_INFO,
69  LogLevel_WARN,
70  LogLevel_ERROR,
71  LogLevel_USER
72  );
73 
75  public:
76  inline static const map<string, LogLevel> levelsByName = {
77  {"TRACE", LogLevel_TRACE},
78  {"DEBUG", LogLevel_DEBUG},
79  {"INFO", LogLevel_INFO},
80  {"WARN", LogLevel_WARN},
81  {"ERROR", LogLevel_ERROR},
82  };
83 
85 
89  void setGlobalLoggerLevel(LogLevel level);
90 
94  void setLevelAll(LogLevel level);
95 
100  void setMainFileName(string fileName);
101 
106  const string getMainFileName();
107 
111  const string getLogLinePrefix();
112 
113  private:
114  inline static CscLoggingConfiguration *instance = nullptr;
116 
117  string mainFileName;
118  string logLinePrefix = "(°°) ";
119  };
120 
121  class CscLogger {
122  public:
123  static void globalLog(LogLevel level, string message, bool hilight = false);
124 
125  void setLevel(LogLevel level);
126  void log(LogLevel level, string message, bool hilight = false) const;
127  void trace(string message, bool hilight = false) const;
128  void debug(string message, bool hilight = false) const;
129  void info(string message, bool hilight = false) const;
130  void warn(string message, bool hilight = false) const;
131  void error(string message, bool hilight = false) const;
132  void user(string message, bool hilight = false) const;
133 
134  static unique_ptr<CscLogger> getForCategory(string category);
135  static string getLogDirectory();
136  static string getMainLogFilePath();
137  static void addLogFileOutput(LogLevel minLevel, const string &outPath);
138 
139  static std::shared_ptr<spdlog::logger> getGlobalLogger();
140  static bool isLoggingReady() {
141  return mainLogSink != NULL;
142  }
143  virtual ~CscLogger() = default;
144 
145  bool isLevelEnabled(LogLevel level) const;
146  bool isTraceEnabled() const;
147  bool isDebugEnabled() const;
148  bool isInfoEnabled() const;
149  bool isWarnEnabled() const;
150  bool isErrorEnabled() const;
151  bool isUserEnabled() const;
152 
153  private:
154  CscLogger(std::shared_ptr<spdlog::logger> internalLogger);
155  std::shared_ptr<spdlog::logger> internalLogger;
156 
157  inline static std::shared_ptr<spdlog::sinks::sink> mainLogSink = nullptr;
158  inline static std::shared_ptr<spdlog::logger> globalLogger = nullptr;
159  inline static mutex sinksInitMutex;
160  inline static mutex globalLoggerInitMutex;
161  inline static std::vector<spdlog::sink_ptr> sinks;
162  static std::shared_ptr<spdlog::sinks::sink> getMainLogSink();
163  static std::vector<spdlog::sink_ptr> getSinks();
164  static void doLog(std::shared_ptr<spdlog::logger> logger, LogLevel level, string message, bool hilight);
165  };
166 }
167 
168 #endif
169 
170 using namespace conscience_utils;
171 using namespace conscience_utils::logging;
172 
173 #if defined LOG_INFO_ENABLED
174 #define LOG_INFO(message) CscLogger::globalLog(LogLevel_INFO, message, false);
175 #define LOG_HILIGHT(message) CscLogger::globalLog(LogLevel_INFO, message, true);
176 #else
177 #define LOG_INFO(message)
178 #define LOG_HILIGHT(message)
179 #endif
180 
181 #if defined LOG_DEBUG_ENABLED
182 #define LOG_DEBUG(message) CscLogger::globalLog(LogLevel_DEBUG, message, false);
183 #else
184 #define LOG_DEBUG(message)
185 #endif
186 
187 #if defined LOG_TRACE_ENABLED
188 #define LOG_TRACE(message) CscLogger::globalLog(LogLevel_TRACE, message, false);
189 #else
190 #define LOG_TRACE(message)
191 #endif
192 
193 #define LOG_WARN(message) CscLogger::globalLog(LogLevel_WARN, message, false);
194 #define LOG_ERROR(message) CscLogger::globalLog(LogLevel_ERROR, message, false);
195 #define LOG_USER(message) CscLogger::globalLog(LogLevel_USER, message, false);
196 
197 #define LOGGER_TRACE(message) if (logger->isTraceEnabled()) { logger->trace(message); }
198 #define LOGGER_DEBUG(message) if (logger->isDebugEnabled()) { logger->debug(message); }
199 #define LOGGER_INFO(message) if (logger->isInfoEnabled()) { logger->info(message); }
200 #define LOGGER_WARN(message) if (logger->isWarnEnabled()) { logger->warn(message); }
201 #define LOGGER_ERROR(message) if (logger->isErrorEnabled()) { logger->error(message); }
202 #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:140
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:121
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:76
conscience_utils::logging::CscLoggingConfiguration
Definition: conscience_log.h:74
conscience_utils::logging::CscLogger::log
void log(LogLevel level, string message, bool hilight=false) const
Definition: conscience_log.cpp:152