diff options
author | Jürgen Gehring <juergen.gehring@bmw.de> | 2015-06-11 06:57:47 -0700 |
---|---|---|
committer | Jürgen Gehring <juergen.gehring@bmw.de> | 2015-06-11 06:57:47 -0700 |
commit | 6c463fcc3dcee619925f08ea09e19a86b9e581cc (patch) | |
tree | 17e765e0623c58778150605d1cd0340c658ce6ab /include/CommonAPI/Logger.hpp | |
parent | 1d83eb38e546e0165f1ad6821f04445b2b9b19d2 (diff) | |
download | genivi-common-api-runtime-6c463fcc3dcee619925f08ea09e19a86b9e581cc.tar.gz |
CommonAPI 3.1.1
Diffstat (limited to 'include/CommonAPI/Logger.hpp')
-rw-r--r-- | include/CommonAPI/Logger.hpp | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/include/CommonAPI/Logger.hpp b/include/CommonAPI/Logger.hpp new file mode 100644 index 0000000..d2761ac --- /dev/null +++ b/include/CommonAPI/Logger.hpp @@ -0,0 +1,179 @@ +// Copyright (C) 2015 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#ifndef COMMONAPI_LOGGER_HPP_ +#define COMMONAPI_LOGGER_HPP_ + +#ifdef USE_DLT +#include <dlt.h> +#endif + +#include <cstdint> +#include <fstream> +#include <memory> +#include <mutex> +#include <sstream> + +#include <CommonAPI/Export.hpp> + +#define COMMONAPI_LOGLEVEL_FATAL 0 +#define COMMONAPI_LOGLEVEL_ERROR 1 +#define COMMONAPI_LOGLEVEL_WARNING 2 +#define COMMONAPI_LOGLEVEL_INFO 3 +#define COMMONAPI_LOGLEVEL_DEBUG 4 +#define COMMONAPI_LOGLEVEL_VERBOSE 5 + +#ifndef COMMONAPI_LOGLEVEL +#define COMMONAPI_LOGLEVEL COMMONAPI_LOGLEVEL_INFO +#endif + +#ifdef WIN32 + +#define COMMONAPI_FATAL(...) \ + do { Logger::log(Logger::Level::LL_FATAL, __VA_ARGS__); } while (false); + +#if COMMONAPI_LOGLEVEL >= COMMONAPI_LOGLEVEL_ERROR +#define COMMONAPI_ERROR(...) \ + do { Logger::log(Logger::Level::LL_ERROR, __VA_ARGS__); } while (false); +#else +#define COMMONAPI_ERROR(...) +#endif + +#if COMMONAPI_LOGLEVEL >= COMMONAPI_LOGLEVEL_WARNING +#define COMMONAPI_WARNING(...) \ + do { Logger::log(Logger::Level::LL_WARNING, __VA_ARGS__); } while (false); +#else +#define COMMONAPI_WARNING(...) +#endif + +#if COMMONAPI_LOGLEVEL >= COMMONAPI_LOGLEVEL_INFO +#define COMMONAPI_INFO(...) \ + do { Logger::log(Logger::Level::LL_INFO, __VA_ARGS__); } while (false); +#else +#define COMMONAPI_INFO(...) +#endif + +#if COMMONAPI_LOGLEVEL >= COMMONAPI_LOGLEVEL_DEBUG +#define COMMONAPI_DEBUG(...) \ + do { Logger::log(Logger::Level::LL_DEBUG, __VA_ARGS__); } while (false); +#else +#define COMMONAPI_DEBUG(...) +#endif + +#if COMMONAPI_LOGLEVEL >= COMMONAPI_LOGLEVEL_VERBOSE +#define COMMONAPI_VERBOSE(...) \ + do { Logger::log(Logger::Level::LL_VERBOSE, __VA_ARGS__); } while (false); +#else +#define COMMONAPI_VERBOSE(...) +#endif + +#else // !WIN32 + +#define COMMONAPI_FATAL(params...) \ + do { Logger::log(Logger::Level::LL_FATAL, params); } while (false); + +#if COMMONAPI_LOGLEVEL >= COMMONAPI_LOGLEVEL_ERROR + #define COMMONAPI_ERROR(params...) \ + do { Logger::log(Logger::Level::LL_ERROR, params); } while (false); +#else + #define COMMONAPI_ERROR(params...) +#endif + +#if COMMONAPI_LOGLEVEL >= COMMONAPI_LOGLEVEL_WARNING + #define COMMONAPI_WARNING(params...) \ + do { Logger::log(Logger::Level::LL_WARNING, params); } while (false); +#else + #define COMMONAPI_WARNING(params...) +#endif + +#if COMMONAPI_LOGLEVEL >= COMMONAPI_LOGLEVEL_INFO + #define COMMONAPI_INFO(params...) \ + do { Logger::log(Logger::Level::LL_INFO, params); } while (false); +#else + #define COMMONAPI_INFO(params...) +#endif + +#if COMMONAPI_LOGLEVEL >= COMMONAPI_LOGLEVEL_DEBUG + #define COMMONAPI_DEBUG(params...) \ + do { Logger::log(Logger::Level::LL_DEBUG, params); } while (false); +#else + #define COMMONAPI_DEBUG(params...) +#endif + +#if COMMONAPI_LOGLEVEL >= COMMONAPI_LOGLEVEL_VERBOSE + #define COMMONAPI_VERBOSE(params...) \ + do { Logger::log(Logger::Level::LL_VERBOSE, params); } while (false); +#else + #define COMMONAPI_VERBOSE(params...) +#endif + +#endif // WIN32 + +namespace CommonAPI { + +class Logger { +public: + COMMONAPI_EXPORT enum class Level : uint8_t { + LL_FATAL = 0, LL_ERROR = 1, LL_WARNING = 2, LL_INFO = 3, LL_DEBUG = 4, LL_VERBOSE = 5 + }; + + COMMONAPI_EXPORT Logger(); + + template<typename... _LogEntries> + COMMONAPI_EXPORT static void log(Level _level, _LogEntries... _entries) { + std::stringstream buffer; + log_intern(buffer, _entries...); + Logger::get()->doLog(_level, buffer.str()); + } + + COMMONAPI_EXPORT static void init(bool, const std::string &, bool = false, const std::string & = ""); + +private: + COMMONAPI_EXPORT static inline std::shared_ptr<Logger> get() { + static std::shared_ptr<Logger> theLogger = std::make_shared<Logger>(); + return theLogger; + } + + COMMONAPI_EXPORT static void log_intern(std::stringstream &_buffer) { + } + + template<typename _LogEntry, typename... _MoreLogEntries> + COMMONAPI_EXPORT static void log_intern(std::stringstream &_buffer, _LogEntry _entry, _MoreLogEntries... _moreEntries) { + _buffer << _entry; + log_intern(_buffer, _moreEntries...); + } + + COMMONAPI_EXPORT void doLog(Level _level, const std::string &_message); + +#if defined(USE_CONSOLE) || defined(USE_FILE) || defined(USE_DLT) + static Level stringAsLevel(const std::string &_level); +#endif +#if defined(USE_CONSOLE) || defined(USE_FILE) + static std::string levelAsString(Level _level); +#endif +#ifdef USE_DLT + static DltLogLevelType levelAsDlt(Level _level); +#endif +#if defined(USE_CONSOLE) || defined(USE_FILE) + static std::mutex mutex_; +#endif +#if defined(USE_CONSOLE) || defined(USE_FILE) || defined(USE_DLT) + static Level maximumLogLevel_; +#endif +#ifdef USE_CONSOLE + static bool useConsole_; +#endif +#ifdef USE_FILE + static std::shared_ptr<std::ofstream> file_; +#endif +#ifdef USE_DLT + static bool useDlt_; + DLT_DECLARE_CONTEXT(dlt_); +#endif +}; + +} // namespace CommonAPI + +#endif // COMMONAPI_LOGGER_HPP_ |