summaryrefslogtreecommitdiff
path: root/src/CommonAPI/Logger.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/CommonAPI/Logger.cpp')
-rw-r--r--src/CommonAPI/Logger.cpp193
1 files changed, 188 insertions, 5 deletions
diff --git a/src/CommonAPI/Logger.cpp b/src/CommonAPI/Logger.cpp
index 268be6f..f5804c8 100644
--- a/src/CommonAPI/Logger.cpp
+++ b/src/CommonAPI/Logger.cpp
@@ -1,15 +1,198 @@
-// Copyright (C) 2015-2017 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+// Copyright (C) 2015-2020 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/.
-#include <CommonAPI/Logger.hpp>
#include <CommonAPI/Runtime.hpp>
+#include <CommonAPI/Logger.hpp>
+
+#ifdef USE_DLT
+#include <dlt/dlt.h>
+#endif
+
+#include <cstdint>
+#include <fstream>
+#include <memory>
+#include <mutex>
+#include <iostream>
namespace CommonAPI {
-void
- Logger::init(bool _useConsole, const std::string &_fileName, bool _useDlt, const std::string &_level) {
- LoggerImpl::init(_useConsole, _fileName, _useDlt, _level);
+
+class Logger::LoggerImpl {
+public:
+ LoggerImpl() :
+ maximumLogLevel_(Logger::Level::CAPI_LOG_INFO),
+ useConsole_(true),
+ useDlt_(false)
+#ifdef USE_DLT
+ , ownAppID_(false)
+#endif
+ {
+ }
+
+ void init(bool _useConsole, const std::string &_fileName, bool _useDlt,
+ const std::string& _level) {
+ useConsole_ = _useConsole;
+ maximumLogLevel_ = stringAsLevel(_level);
+ useDlt_ = _useDlt;
+
+ if (!_fileName.empty()) {
+ file_ = std::make_shared<std::ofstream>();
+ if (file_) {
+ file_->open(_fileName.c_str(),
+ std::ofstream::out | std::ofstream::app);
+ }
+ }
+#ifdef USE_DLT
+ if (useDlt_) {
+ std::string app = Runtime::getProperty("LogApplication");
+ if (!app.empty()) {
+ ownAppID_ = true;
+ DLT_REGISTER_APP(app.c_str(), "CommonAPI Application");
+ }
+
+ std::string context = Runtime::getProperty("LogContext");
+ if (context == "")
+ context = "CAPI";
+ DLT_REGISTER_CONTEXT(dlt_, context.c_str(), "CAPI");
+ }
+#endif
+ }
+
+ ~LoggerImpl() {
+#ifdef USE_DLT
+ if (useDlt_) {
+ DLT_UNREGISTER_CONTEXT(dlt_);
+ if (ownAppID_) {
+ DLT_UNREGISTER_APP()
+ ;
+ }
+ }
+#endif
+ }
+
+ bool isLogged(Logger::Level _level) {
+ return (_level <= maximumLogLevel_) ? true : false;
+ }
+
+ void doLog(Logger::Level _level, const std::string &_message) {
+ if (useConsole_) {
+ std::lock_guard<std::mutex> itsLock(mutex_);
+ std::cerr << "[CAPI][" << levelAsString(_level) << "] " << _message
+ << std::endl;
+ }
+ if (file_ && file_->is_open()) {
+ std::lock_guard<std::mutex> itsLock(mutex_);
+ (*(file_.get())) << "[CAPI][" << levelAsString(_level) << "] "
+ << _message << std::endl;
+ }
+
+#ifdef USE_DLT
+ if (useDlt_) {
+ DLT_LOG_STRING(dlt_, levelAsDlt(_level), _message.c_str());
+ }
+#endif
+
+ }
+
+ static Logger::Level stringAsLevel(const std::string &_level) {
+ Logger::Level level(Logger::Level::CAPI_LOG_INFO);
+ if (_level == "none") {
+ level = Logger::Level::CAPI_LOG_NONE;
+ } else if (_level == "fatal") {
+ level = Logger::Level::CAPI_LOG_FATAL;
+ } else if (_level == "error") {
+ level = Logger::Level::CAPI_LOG_ERROR;
+ } else if (_level == "warning") {
+ level = Logger::Level::CAPI_LOG_WARNING;
+ } else if (_level == "info") {
+ level = Logger::Level::CAPI_LOG_INFO;
+ } else if (_level == "debug") {
+ level = Logger::Level::CAPI_LOG_DEBUG;
+ } else if (_level == "verbose") {
+ level = Logger::Level::CAPI_LOG_VERBOSE;
+ }
+ return level;
+ }
+
+private:
+ static std::string levelAsString(Logger::Level _level) {
+ switch (_level) {
+ case Logger::Level::CAPI_LOG_NONE:
+ return "NONE";
+ case Logger::Level::CAPI_LOG_FATAL:
+ return "FATAL";
+ case Logger::Level::CAPI_LOG_ERROR:
+ return "ERROR";
+ case Logger::Level::CAPI_LOG_WARNING:
+ return "WARNING";
+ case Logger::Level::CAPI_LOG_INFO:
+ return "INFO";
+ case Logger::Level::CAPI_LOG_DEBUG:
+ return "DEBUG";
+ case Logger::Level::CAPI_LOG_VERBOSE:
+ return "VERBOSE";
+ default:
+ return "";
+ }
+ }
+
+#ifdef USE_DLT
+ static DltLogLevelType levelAsDlt(Logger::Level _level) {
+ switch (_level) {
+ case Logger::Level::CAPI_LOG_NONE:
+ return DLT_LOG_OFF;
+ case Logger::Level::CAPI_LOG_FATAL:
+ return DLT_LOG_FATAL;
+ case Logger::Level::CAPI_LOG_ERROR:
+ return DLT_LOG_ERROR;
+ case Logger::Level::CAPI_LOG_WARNING:
+ return DLT_LOG_WARN;
+ case Logger::Level::CAPI_LOG_INFO:
+ return DLT_LOG_INFO;
+ case Logger::Level::CAPI_LOG_DEBUG:
+ return DLT_LOG_DEBUG;
+ case Logger::Level::CAPI_LOG_VERBOSE:
+ return DLT_LOG_VERBOSE;
+ default:
+ return DLT_LOG_DEFAULT;
+ }
+ }
+#endif
+
+private:
+ std::mutex mutex_;
+
+ Logger::Level maximumLogLevel_;
+
+ bool useConsole_;
+
+ std::shared_ptr<std::ofstream> file_;
+
+ bool useDlt_;
+#ifdef USE_DLT
+ DLT_DECLARE_CONTEXT(dlt_)
+ bool ownAppID_;
+#endif
+};
+
+std::unique_ptr<Logger::LoggerImpl> Logger::loggerImpl_ =
+ std::unique_ptr<Logger::LoggerImpl>(new Logger::LoggerImpl());
+
+Logger::Logger() = default;
+Logger::~Logger() = default;
+
+void Logger::init(bool _useConsole, const std::string &_fileName, bool _useDlt,
+ const std::string& _level) {
+ loggerImpl_->init(_useConsole, _fileName, _useDlt, _level);
+}
+
+bool Logger::isLogged(Level _level) {
+ return loggerImpl_->isLogged(_level);
+}
+
+void Logger::doLog(Level _level, const std::string& _message) {
+ loggerImpl_->doLog(_level, _message);
}
} //namespace CommonAPI