// Copyright (C) 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "icing/util/logging_raw.h" #include #include #include "icing/proto/debug.pb.h" // NOTE: this file contains two implementations: one for Android, one for all // other cases. We always build exactly one implementation. #if defined(__ANDROID__) // Compiled as part of Android. #include namespace icing { namespace lib { namespace { // Converts LogSeverity to level for __android_log_write. int GetAndroidLogLevel(LogSeverity::Code severity) { switch (severity) { case LogSeverity::VERBOSE: return ANDROID_LOG_VERBOSE; case LogSeverity::DBG: return ANDROID_LOG_DEBUG; case LogSeverity::INFO: return ANDROID_LOG_INFO; case LogSeverity::WARNING: return ANDROID_LOG_WARN; case LogSeverity::ERROR: return ANDROID_LOG_ERROR; case LogSeverity::FATAL: return ANDROID_LOG_FATAL; } } } // namespace void LowLevelLogging(LogSeverity::Code severity, const std::string& tag, const std::string& message) { const int android_log_level = GetAndroidLogLevel(severity); #if __ANDROID_API__ >= 30 if (!__android_log_is_loggable(android_log_level, tag.c_str(), /*default_prio=*/ANDROID_LOG_INFO)) { return; } #endif // __ANDROID_API__ >= 30 __android_log_write(android_log_level, tag.c_str(), message.c_str()); } } // namespace lib } // namespace icing #else // if defined(__ANDROID__) // Not on Android: implement LowLevelLogging to print to stderr (see below). namespace icing { namespace lib { namespace { // Converts LogSeverity to human-readable text. const char *LogSeverityToString(LogSeverity::Code severity) { switch (severity) { case LogSeverity::VERBOSE: return "VERBOSE"; case LogSeverity::DBG: return "DEBUG"; case LogSeverity::INFO: return "INFO"; case LogSeverity::WARNING: return "WARNING"; case LogSeverity::ERROR: return "ERROR"; case LogSeverity::FATAL: return "FATAL"; } } } // namespace void LowLevelLogging(LogSeverity::Code severity, const std::string &tag, const std::string &message) { // TODO(b/146903474) Do not log to stderr for logs other than FATAL and ERROR. fprintf(stderr, "[%s] %s : %s\n", LogSeverityToString(severity), tag.c_str(), message.c_str()); fflush(stderr); } } // namespace lib } // namespace icing #endif // if defined(__ANDROID__)