1*6fa2df46SAndroid Build Coastguard Worker // Copyright (C) 2021 The Android Open Source Project 2*6fa2df46SAndroid Build Coastguard Worker // 3*6fa2df46SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 4*6fa2df46SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 5*6fa2df46SAndroid Build Coastguard Worker // You may obtain a copy of the License at 6*6fa2df46SAndroid Build Coastguard Worker // 7*6fa2df46SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0 8*6fa2df46SAndroid Build Coastguard Worker // 9*6fa2df46SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*6fa2df46SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 11*6fa2df46SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*6fa2df46SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 13*6fa2df46SAndroid Build Coastguard Worker // limitations under the License. 14*6fa2df46SAndroid Build Coastguard Worker 15*6fa2df46SAndroid Build Coastguard Worker #pragma once 16*6fa2df46SAndroid Build Coastguard Worker 17*6fa2df46SAndroid Build Coastguard Worker #include <stdio.h> 18*6fa2df46SAndroid Build Coastguard Worker 19*6fa2df46SAndroid Build Coastguard Worker #include <iostream> 20*6fa2df46SAndroid Build Coastguard Worker #include <sstream> 21*6fa2df46SAndroid Build Coastguard Worker #include <string> 22*6fa2df46SAndroid Build Coastguard Worker #include <vector> 23*6fa2df46SAndroid Build Coastguard Worker 24*6fa2df46SAndroid Build Coastguard Worker namespace dittosuite { 25*6fa2df46SAndroid Build Coastguard Worker 26*6fa2df46SAndroid Build Coastguard Worker enum class LogLevel { kVerbose, kDebug, kInfo, kWarning, kError, kFatal }; 27*6fa2df46SAndroid Build Coastguard Worker 28*6fa2df46SAndroid Build Coastguard Worker enum class LogStream { kStdout, kLogcat }; 29*6fa2df46SAndroid Build Coastguard Worker 30*6fa2df46SAndroid Build Coastguard Worker class Logger { 31*6fa2df46SAndroid Build Coastguard Worker public: 32*6fa2df46SAndroid Build Coastguard Worker Logger(Logger const&) = delete; 33*6fa2df46SAndroid Build Coastguard Worker void operator=(Logger const&) = delete; 34*6fa2df46SAndroid Build Coastguard Worker static Logger& GetInstance(); 35*6fa2df46SAndroid Build Coastguard Worker void SetLogLevel(LogLevel log_level); 36*6fa2df46SAndroid Build Coastguard Worker void SetLogStream(LogStream log_stream); 37*6fa2df46SAndroid Build Coastguard Worker LogLevel GetLogLevel() const; 38*6fa2df46SAndroid Build Coastguard Worker LogStream GetLogStream() const; 39*6fa2df46SAndroid Build Coastguard Worker void WriteLogMessage(LogLevel log_level, const std::string& message, const std::string& file_name, 40*6fa2df46SAndroid Build Coastguard Worker int line, bool print_errno); 41*6fa2df46SAndroid Build Coastguard Worker 42*6fa2df46SAndroid Build Coastguard Worker protected: Logger()43*6fa2df46SAndroid Build Coastguard Worker Logger() : log_level_(LogLevel::kInfo) {} 44*6fa2df46SAndroid Build Coastguard Worker 45*6fa2df46SAndroid Build Coastguard Worker private: 46*6fa2df46SAndroid Build Coastguard Worker LogLevel log_level_; 47*6fa2df46SAndroid Build Coastguard Worker LogStream log_stream_; 48*6fa2df46SAndroid Build Coastguard Worker }; 49*6fa2df46SAndroid Build Coastguard Worker 50*6fa2df46SAndroid Build Coastguard Worker LogLevel ArgToLogLevel(const std::string_view optarg); 51*6fa2df46SAndroid Build Coastguard Worker 52*6fa2df46SAndroid Build Coastguard Worker } // namespace dittosuite 53*6fa2df46SAndroid Build Coastguard Worker 54*6fa2df46SAndroid Build Coastguard Worker #define DITTO_LOGGER dittosuite::Logger::GetInstance() 55*6fa2df46SAndroid Build Coastguard Worker 56*6fa2df46SAndroid Build Coastguard Worker #define DITTO_LOG(VERBOSITY, X, print_errno) \ 57*6fa2df46SAndroid Build Coastguard Worker do { \ 58*6fa2df46SAndroid Build Coastguard Worker if (DITTO_LOGGER.GetLogLevel() <= dittosuite::LogLevel::VERBOSITY) { \ 59*6fa2df46SAndroid Build Coastguard Worker DITTO_LOGGER.WriteLogMessage(dittosuite::LogLevel::VERBOSITY, X, __FILE__, __LINE__, \ 60*6fa2df46SAndroid Build Coastguard Worker print_errno); \ 61*6fa2df46SAndroid Build Coastguard Worker } \ 62*6fa2df46SAndroid Build Coastguard Worker } while (false) 63*6fa2df46SAndroid Build Coastguard Worker 64*6fa2df46SAndroid Build Coastguard Worker #define LOGF(X) \ 65*6fa2df46SAndroid Build Coastguard Worker do { \ 66*6fa2df46SAndroid Build Coastguard Worker DITTO_LOG(kFatal, X, false); \ 67*6fa2df46SAndroid Build Coastguard Worker exit(EXIT_FAILURE); \ 68*6fa2df46SAndroid Build Coastguard Worker } while (false) 69*6fa2df46SAndroid Build Coastguard Worker #define LOGE(X) DITTO_LOG(kError, X, false) 70*6fa2df46SAndroid Build Coastguard Worker #define LOGW(X) DITTO_LOG(kWarning, X, false) 71*6fa2df46SAndroid Build Coastguard Worker #define LOGI(X) DITTO_LOG(kInfo, X, false) 72*6fa2df46SAndroid Build Coastguard Worker #define LOGD(X) DITTO_LOG(kDebug, X, false) 73*6fa2df46SAndroid Build Coastguard Worker #define LOGV(X) DITTO_LOG(kVerbose, X, false) 74*6fa2df46SAndroid Build Coastguard Worker 75*6fa2df46SAndroid Build Coastguard Worker #define PLOGF(X) \ 76*6fa2df46SAndroid Build Coastguard Worker do { \ 77*6fa2df46SAndroid Build Coastguard Worker DITTO_LOG(kFatal, X, true); \ 78*6fa2df46SAndroid Build Coastguard Worker exit(EXIT_FAILURE); \ 79*6fa2df46SAndroid Build Coastguard Worker } while (false) 80*6fa2df46SAndroid Build Coastguard Worker #define PLOGE(X) DITTO_LOG(kError, X, true) 81*6fa2df46SAndroid Build Coastguard Worker #define PLOGW(X) DITTO_LOG(kWarning, X, true) 82*6fa2df46SAndroid Build Coastguard Worker #define PLOGI(X) DITTO_LOG(kInfo, X, true) 83*6fa2df46SAndroid Build Coastguard Worker #define PLOGD(X) DITTO_LOG(kDebug, X, true) 84*6fa2df46SAndroid Build Coastguard Worker #define PLOGV(X) DITTO_LOG(kVerbose, X, true) 85