1*993b0882SAndroid Build Coastguard Worker /*
2*993b0882SAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project
3*993b0882SAndroid Build Coastguard Worker *
4*993b0882SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*993b0882SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*993b0882SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*993b0882SAndroid Build Coastguard Worker *
8*993b0882SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*993b0882SAndroid Build Coastguard Worker *
10*993b0882SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*993b0882SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*993b0882SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*993b0882SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*993b0882SAndroid Build Coastguard Worker * limitations under the License.
15*993b0882SAndroid Build Coastguard Worker */
16*993b0882SAndroid Build Coastguard Worker
17*993b0882SAndroid Build Coastguard Worker #include "utils/base/logging_raw.h"
18*993b0882SAndroid Build Coastguard Worker
19*993b0882SAndroid Build Coastguard Worker #include <stdio.h>
20*993b0882SAndroid Build Coastguard Worker
21*993b0882SAndroid Build Coastguard Worker #include <string>
22*993b0882SAndroid Build Coastguard Worker
23*993b0882SAndroid Build Coastguard Worker #define TC3_RETURN_IF_NOT_ERROR_OR_FATAL \
24*993b0882SAndroid Build Coastguard Worker if (severity != ERROR && severity != FATAL) { \
25*993b0882SAndroid Build Coastguard Worker return; \
26*993b0882SAndroid Build Coastguard Worker }
27*993b0882SAndroid Build Coastguard Worker
28*993b0882SAndroid Build Coastguard Worker // NOTE: this file contains two implementations: one for Android, one for all
29*993b0882SAndroid Build Coastguard Worker // other cases. We always build exactly one implementation.
30*993b0882SAndroid Build Coastguard Worker #if defined(__ANDROID__)
31*993b0882SAndroid Build Coastguard Worker
32*993b0882SAndroid Build Coastguard Worker // Compiled as part of Android.
33*993b0882SAndroid Build Coastguard Worker #include <android/log.h>
34*993b0882SAndroid Build Coastguard Worker
35*993b0882SAndroid Build Coastguard Worker namespace libtextclassifier3 {
36*993b0882SAndroid Build Coastguard Worker namespace logging {
37*993b0882SAndroid Build Coastguard Worker
38*993b0882SAndroid Build Coastguard Worker namespace {
39*993b0882SAndroid Build Coastguard Worker // Converts LogSeverity to level for __android_log_write.
GetAndroidLogLevel(LogSeverity severity)40*993b0882SAndroid Build Coastguard Worker int GetAndroidLogLevel(LogSeverity severity) {
41*993b0882SAndroid Build Coastguard Worker switch (severity) {
42*993b0882SAndroid Build Coastguard Worker case FATAL:
43*993b0882SAndroid Build Coastguard Worker return ANDROID_LOG_FATAL;
44*993b0882SAndroid Build Coastguard Worker case ERROR:
45*993b0882SAndroid Build Coastguard Worker return ANDROID_LOG_ERROR;
46*993b0882SAndroid Build Coastguard Worker case WARNING:
47*993b0882SAndroid Build Coastguard Worker return ANDROID_LOG_WARN;
48*993b0882SAndroid Build Coastguard Worker case INFO:
49*993b0882SAndroid Build Coastguard Worker return ANDROID_LOG_INFO;
50*993b0882SAndroid Build Coastguard Worker default:
51*993b0882SAndroid Build Coastguard Worker return ANDROID_LOG_DEBUG;
52*993b0882SAndroid Build Coastguard Worker }
53*993b0882SAndroid Build Coastguard Worker }
54*993b0882SAndroid Build Coastguard Worker } // namespace
55*993b0882SAndroid Build Coastguard Worker
LowLevelLogging(LogSeverity severity,const std::string & tag,const std::string & message)56*993b0882SAndroid Build Coastguard Worker void LowLevelLogging(LogSeverity severity, const std::string& tag,
57*993b0882SAndroid Build Coastguard Worker const std::string& message) {
58*993b0882SAndroid Build Coastguard Worker #if !defined(TC3_DEBUG_LOGGING)
59*993b0882SAndroid Build Coastguard Worker TC3_RETURN_IF_NOT_ERROR_OR_FATAL
60*993b0882SAndroid Build Coastguard Worker #endif
61*993b0882SAndroid Build Coastguard Worker const int android_log_level = GetAndroidLogLevel(severity);
62*993b0882SAndroid Build Coastguard Worker __android_log_write(android_log_level, tag.c_str(), message.c_str());
63*993b0882SAndroid Build Coastguard Worker }
64*993b0882SAndroid Build Coastguard Worker
65*993b0882SAndroid Build Coastguard Worker } // namespace logging
66*993b0882SAndroid Build Coastguard Worker } // namespace libtextclassifier3
67*993b0882SAndroid Build Coastguard Worker
68*993b0882SAndroid Build Coastguard Worker #else // if defined(__ANDROID__)
69*993b0882SAndroid Build Coastguard Worker
70*993b0882SAndroid Build Coastguard Worker // Not on Android: implement LowLevelLogging to print to stderr (see below).
71*993b0882SAndroid Build Coastguard Worker namespace libtextclassifier3 {
72*993b0882SAndroid Build Coastguard Worker namespace logging {
73*993b0882SAndroid Build Coastguard Worker
74*993b0882SAndroid Build Coastguard Worker namespace {
75*993b0882SAndroid Build Coastguard Worker // Converts LogSeverity to human-readable text.
LogSeverityToString(LogSeverity severity)76*993b0882SAndroid Build Coastguard Worker const char *LogSeverityToString(LogSeverity severity) {
77*993b0882SAndroid Build Coastguard Worker switch (severity) {
78*993b0882SAndroid Build Coastguard Worker case INFO:
79*993b0882SAndroid Build Coastguard Worker return "INFO";
80*993b0882SAndroid Build Coastguard Worker case WARNING:
81*993b0882SAndroid Build Coastguard Worker return "WARNING";
82*993b0882SAndroid Build Coastguard Worker case ERROR:
83*993b0882SAndroid Build Coastguard Worker return "ERROR";
84*993b0882SAndroid Build Coastguard Worker case FATAL:
85*993b0882SAndroid Build Coastguard Worker return "FATAL";
86*993b0882SAndroid Build Coastguard Worker default:
87*993b0882SAndroid Build Coastguard Worker return "UNKNOWN";
88*993b0882SAndroid Build Coastguard Worker }
89*993b0882SAndroid Build Coastguard Worker }
90*993b0882SAndroid Build Coastguard Worker } // namespace
91*993b0882SAndroid Build Coastguard Worker
LowLevelLogging(LogSeverity severity,const std::string & tag,const std::string & message)92*993b0882SAndroid Build Coastguard Worker void LowLevelLogging(LogSeverity severity, const std::string &tag,
93*993b0882SAndroid Build Coastguard Worker const std::string &message) {
94*993b0882SAndroid Build Coastguard Worker #if !defined(TC3_DEBUG_LOGGING)
95*993b0882SAndroid Build Coastguard Worker TC3_RETURN_IF_NOT_ERROR_OR_FATAL
96*993b0882SAndroid Build Coastguard Worker #endif
97*993b0882SAndroid Build Coastguard Worker fprintf(stderr, "[%s] %s : %s\n", LogSeverityToString(severity), tag.c_str(),
98*993b0882SAndroid Build Coastguard Worker message.c_str());
99*993b0882SAndroid Build Coastguard Worker fflush(stderr);
100*993b0882SAndroid Build Coastguard Worker }
101*993b0882SAndroid Build Coastguard Worker
102*993b0882SAndroid Build Coastguard Worker } // namespace logging
103*993b0882SAndroid Build Coastguard Worker } // namespace libtextclassifier3
104*993b0882SAndroid Build Coastguard Worker
105*993b0882SAndroid Build Coastguard Worker #endif // if defined(__ANDROID__)
106