33 #include <spdlog/spdlog.h>
34 #include <spdlog/sinks/null_sink.h>
47 Logger::makeLogger(std::string
const &name,
48 std::shared_ptr<spdlog::logger>
const &logger) {
50 #ifdef OSVR_USE_UNIQUEPTR_FOR_LOGGER
51 auto ret = LoggerPtr{
new Logger{
52 name, logger,
static_cast<PrivateConstructor *
>(
nullptr)}};
54 auto ret = std::make_shared<Logger>(
55 name, logger,
static_cast<PrivateConstructor *
>(
nullptr));
61 std::shared_ptr<spdlog::logger> logger,
63 : name_(name), logger_(
std::move(logger)) {}
67 LoggerPtr Logger::makeFallback(std::string
const &name) {
71 std::cerr <<
"WARNING: Logger created for '" << name
72 <<
"' is a 'fallback' logger -- an internal error has "
73 "prevented a standard logger from being created. "
74 "Please report this issue in OSVR-Core on GitHub."
77 auto console_logger = spdlog::stderr_logger_mt(name);
78 return makeLogger(name, console_logger);
80 std::cerr <<
"Failed to create a console logger to use as a "
81 "fallback. Logging will be disabled entirely."
83 auto null_sink = std::make_shared<spdlog::sinks::null_sink_st>();
84 auto null_logger = std::make_shared<spdlog::logger>(name, null_sink);
85 return makeLogger(name, null_logger);
90 std::string
const &name, std::shared_ptr<spdlog::logger> logger) {
93 <<
"WARNING: Logger::makeFromExistingImplementation(\""
94 << name <<
"\", logger) called with a null logger pointer! "
95 <<
"Will result in a fallback logger!" << std::endl;
96 return makeFallback(name);
98 return makeLogger(name, logger);
102 spdlog::sink_ptr sink) {
105 std::cerr <<
"WARNING: Logger::makeWithSink(\"" << name
106 <<
"\", sink) called with a null sink! Will result "
107 "in a fallback logger!"
109 return makeFallback(name);
111 auto spd_logger = std::make_shared<spdlog::logger>(name, sink);
112 spd_logger->set_pattern(DEFAULT_PATTERN);
113 spd_logger->flush_on(convertToLevelEnum(DEFAULT_FLUSH_LEVEL));
114 return makeLogger(name, spd_logger);
118 spdlog::sinks_init_list sinks) {
119 for (
auto &sink : sinks) {
121 std::cerr <<
"WARNING: "
122 "Logger::makeWithSinks(\""
123 << name <<
"\", sinks) called "
124 "with at least one null sink! Will "
125 "result in a fallback logger!"
132 return makeFallback(name);
135 auto spd_logger = std::make_shared<spdlog::logger>(name, sinks);
136 spd_logger->set_pattern(DEFAULT_PATTERN);
137 spd_logger->flush_on(convertToLevelEnum(DEFAULT_FLUSH_LEVEL));
138 return makeLogger(name, spd_logger);
142 return convertFromLevelEnum(logger_->level());
146 logger_->set_level(convertToLevelEnum(level));
150 logger_->flush_on(convertToLevelEnum(level));
154 return { *
this, LogLevel::trace, msg };
157 Logger::StreamProxy Logger::debug(
const char *msg) {
158 return { *
this, LogLevel::debug, msg };
161 Logger::StreamProxy Logger::info(
const char *msg) {
162 return { *
this, LogLevel::info, msg };
165 Logger::StreamProxy Logger::notice(
const char *msg) {
166 return { *
this, LogLevel::notice, msg };
169 Logger::StreamProxy Logger::warn(
const char *msg) {
170 return { *
this, LogLevel::warn, msg };
173 Logger::StreamProxy Logger::error(
const char *msg) {
174 return { *
this, LogLevel::error, msg };
177 Logger::StreamProxy Logger::critical(
const char *msg) {
178 return { *
this, LogLevel::critical, msg };
182 Logger::StreamProxy Logger::trace() {
183 return { *
this, LogLevel::trace };
186 Logger::StreamProxy Logger::debug() {
187 return { *
this, LogLevel::debug };
190 Logger::StreamProxy Logger::info() {
191 return { *
this, LogLevel::info };
194 Logger::StreamProxy Logger::notice() {
195 return { *
this, LogLevel::notice };
198 Logger::StreamProxy Logger::warn() {
199 return { *
this, LogLevel::warn };
202 Logger::StreamProxy Logger::error() {
203 return { *
this, LogLevel::error };
206 Logger::StreamProxy Logger::critical() {
207 return { *
this, LogLevel::critical };
213 case LogLevel::trace:
215 case LogLevel::debug:
219 case LogLevel::notice:
223 case LogLevel::error:
225 case LogLevel::critical:
226 return critical(msg);
235 case LogLevel::trace:
237 case LogLevel::debug:
241 case LogLevel::notice:
245 case LogLevel::error:
247 case LogLevel::critical:
258 void Logger::write(LogLevel level,
const char* msg)
260 logger_->log(convertToLevelEnum(level), msg);
static LoggerPtr makeFromExistingImplementation(std::string const &name, std::shared_ptr< spdlog::logger > logger)
void setLogLevel(LogLevel level)
static LoggerPtr makeWithSinks(std::string const &name, spdlog::sinks_init_list sinks)
LogLevel getLogLevel() const
static LoggerPtr makeWithSink(std::string const &name, spdlog::sink_ptr sink)
Header to include for OSVR-internal usage of the logging mechanism: provides the needed definition of...
Logger(std::string const &name, std::shared_ptr< spdlog::logger > logger, PrivateConstructor *)
void flushOn(LogLevel level)
Set the log level at which this logger will trigger a flush.
void flush()
Make sure this logger has written out its data.
StreamProxy log(LogLevel level, const char *msg)