xref: /aosp_15_r20/test/dittosuite/include/ditto/logger.h (revision 6fa2df46f119dce7527f5beb2814eca0e6f886ac)
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