xref: /aosp_15_r20/test/dittosuite/src/logger.cpp (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 #ifdef __ANDROID__
16*6fa2df46SAndroid Build Coastguard Worker #include <android-base/logging.h>
17*6fa2df46SAndroid Build Coastguard Worker #include <log/log.h>
18*6fa2df46SAndroid Build Coastguard Worker #endif
19*6fa2df46SAndroid Build Coastguard Worker 
20*6fa2df46SAndroid Build Coastguard Worker #include <ditto/logger.h>
21*6fa2df46SAndroid Build Coastguard Worker 
22*6fa2df46SAndroid Build Coastguard Worker #include <string.h>
23*6fa2df46SAndroid Build Coastguard Worker 
24*6fa2df46SAndroid Build Coastguard Worker #include <chrono>
25*6fa2df46SAndroid Build Coastguard Worker #include <iomanip>
26*6fa2df46SAndroid Build Coastguard Worker 
27*6fa2df46SAndroid Build Coastguard Worker namespace dittosuite {
28*6fa2df46SAndroid Build Coastguard Worker 
GetInstance()29*6fa2df46SAndroid Build Coastguard Worker Logger& Logger::GetInstance() {
30*6fa2df46SAndroid Build Coastguard Worker   static Logger logger;
31*6fa2df46SAndroid Build Coastguard Worker   return logger;
32*6fa2df46SAndroid Build Coastguard Worker }
33*6fa2df46SAndroid Build Coastguard Worker 
SetLogLevel(const LogLevel log_level)34*6fa2df46SAndroid Build Coastguard Worker void Logger::SetLogLevel(const LogLevel log_level) {
35*6fa2df46SAndroid Build Coastguard Worker   log_level_ = log_level;
36*6fa2df46SAndroid Build Coastguard Worker }
37*6fa2df46SAndroid Build Coastguard Worker 
SetLogStream(const LogStream log_stream)38*6fa2df46SAndroid Build Coastguard Worker void Logger::SetLogStream(const LogStream log_stream) {
39*6fa2df46SAndroid Build Coastguard Worker   log_stream_ = log_stream;
40*6fa2df46SAndroid Build Coastguard Worker }
41*6fa2df46SAndroid Build Coastguard Worker 
GetLogLevel() const42*6fa2df46SAndroid Build Coastguard Worker LogLevel Logger::GetLogLevel() const {
43*6fa2df46SAndroid Build Coastguard Worker   return log_level_;
44*6fa2df46SAndroid Build Coastguard Worker }
45*6fa2df46SAndroid Build Coastguard Worker 
GetLogStream() const46*6fa2df46SAndroid Build Coastguard Worker LogStream Logger::GetLogStream() const {
47*6fa2df46SAndroid Build Coastguard Worker   return log_stream_;
48*6fa2df46SAndroid Build Coastguard Worker }
49*6fa2df46SAndroid Build Coastguard Worker 
LogLevelToString(const LogLevel log_level)50*6fa2df46SAndroid Build Coastguard Worker std::string LogLevelToString(const LogLevel log_level) {
51*6fa2df46SAndroid Build Coastguard Worker   static const std::string prefixes[] = {"VERBOSE", "DEBUG", "INFO", "WARNING", "ERROR", "FATAL"};
52*6fa2df46SAndroid Build Coastguard Worker   return prefixes[static_cast<int>(log_level)];
53*6fa2df46SAndroid Build Coastguard Worker }
54*6fa2df46SAndroid Build Coastguard Worker 
55*6fa2df46SAndroid Build Coastguard Worker #ifdef __ANDROID__
LogLevelToAndroidLogLevel(const LogLevel log_level)56*6fa2df46SAndroid Build Coastguard Worker android::base::LogSeverity LogLevelToAndroidLogLevel(const LogLevel log_level) {
57*6fa2df46SAndroid Build Coastguard Worker   switch (log_level) {
58*6fa2df46SAndroid Build Coastguard Worker     case LogLevel::kVerbose:
59*6fa2df46SAndroid Build Coastguard Worker       return android::base::VERBOSE;
60*6fa2df46SAndroid Build Coastguard Worker     case LogLevel::kDebug:
61*6fa2df46SAndroid Build Coastguard Worker       return android::base::DEBUG;
62*6fa2df46SAndroid Build Coastguard Worker     case LogLevel::kInfo:
63*6fa2df46SAndroid Build Coastguard Worker       return android::base::INFO;
64*6fa2df46SAndroid Build Coastguard Worker     case LogLevel::kWarning:
65*6fa2df46SAndroid Build Coastguard Worker       return android::base::WARNING;
66*6fa2df46SAndroid Build Coastguard Worker     case LogLevel::kError:
67*6fa2df46SAndroid Build Coastguard Worker       return android::base::ERROR;
68*6fa2df46SAndroid Build Coastguard Worker     case LogLevel::kFatal:
69*6fa2df46SAndroid Build Coastguard Worker       return android::base::FATAL;
70*6fa2df46SAndroid Build Coastguard Worker   }
71*6fa2df46SAndroid Build Coastguard Worker }
72*6fa2df46SAndroid Build Coastguard Worker #endif
73*6fa2df46SAndroid Build Coastguard Worker 
WriteLogMessage(const LogLevel log_level,const std::string & message,const std::string & file_name,int line,bool print_errno)74*6fa2df46SAndroid Build Coastguard Worker void Logger::WriteLogMessage(const LogLevel log_level, const std::string& message,
75*6fa2df46SAndroid Build Coastguard Worker                              const std::string& file_name, int line, bool print_errno) {
76*6fa2df46SAndroid Build Coastguard Worker   using namespace std::chrono;
77*6fa2df46SAndroid Build Coastguard Worker 
78*6fa2df46SAndroid Build Coastguard Worker   std::stringstream ss;
79*6fa2df46SAndroid Build Coastguard Worker 
80*6fa2df46SAndroid Build Coastguard Worker   auto now = system_clock::now();
81*6fa2df46SAndroid Build Coastguard Worker   auto ms = duration_cast<milliseconds>(now.time_since_epoch()) % 1000;
82*6fa2df46SAndroid Build Coastguard Worker   auto timer = system_clock::to_time_t(now);
83*6fa2df46SAndroid Build Coastguard Worker   std::tm bt = *std::localtime(&timer);
84*6fa2df46SAndroid Build Coastguard Worker 
85*6fa2df46SAndroid Build Coastguard Worker   // Date/time
86*6fa2df46SAndroid Build Coastguard Worker   ss << '[' << std::put_time(&bt, "%F %T") << '.' << std::setfill('0') << std::setw(3) << ms.count()
87*6fa2df46SAndroid Build Coastguard Worker      << ']';
88*6fa2df46SAndroid Build Coastguard Worker   // Log level
89*6fa2df46SAndroid Build Coastguard Worker   ss << " " << LogLevelToString(log_level);
90*6fa2df46SAndroid Build Coastguard Worker   // File and line
91*6fa2df46SAndroid Build Coastguard Worker   ss << ' ' << file_name << ":" << line;
92*6fa2df46SAndroid Build Coastguard Worker   // Message and errno
93*6fa2df46SAndroid Build Coastguard Worker   ss << " " << message;
94*6fa2df46SAndroid Build Coastguard Worker   if (print_errno) {
95*6fa2df46SAndroid Build Coastguard Worker     ss << ": " << strerror(errno);
96*6fa2df46SAndroid Build Coastguard Worker   }
97*6fa2df46SAndroid Build Coastguard Worker   switch (log_stream_) {
98*6fa2df46SAndroid Build Coastguard Worker     case LogStream::kLogcat:
99*6fa2df46SAndroid Build Coastguard Worker #ifdef __ANDROID__
100*6fa2df46SAndroid Build Coastguard Worker       LOG(LogLevelToAndroidLogLevel(log_level)) << ss.str();
101*6fa2df46SAndroid Build Coastguard Worker       break;
102*6fa2df46SAndroid Build Coastguard Worker #else
103*6fa2df46SAndroid Build Coastguard Worker       [[fallthrough]];
104*6fa2df46SAndroid Build Coastguard Worker #endif
105*6fa2df46SAndroid Build Coastguard Worker     case LogStream::kStdout:
106*6fa2df46SAndroid Build Coastguard Worker       std::cout << ss.str() << std::endl;
107*6fa2df46SAndroid Build Coastguard Worker       break;
108*6fa2df46SAndroid Build Coastguard Worker   }
109*6fa2df46SAndroid Build Coastguard Worker }
110*6fa2df46SAndroid Build Coastguard Worker 
111*6fa2df46SAndroid Build Coastguard Worker }  // namespace dittosuite
112