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