19a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu/* 29a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu * Copyright (C) 2017 The Android Open Source Project 39a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu * 49a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu * Licensed under the Apache License, Version 2.0 (the "License"); 59a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu * you may not use this file except in compliance with the License. 69a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu * You may obtain a copy of the License at 79a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu * 89a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu * http://www.apache.org/licenses/LICENSE-2.0 99a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu * 109a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu * Unless required by applicable law or agreed to in writing, software 119a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu * distributed under the License is distributed on an "AS IS" BASIS, 129a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu * See the License for the specific language governing permissions and 149a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu * limitations under the License. 159a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu */ 169a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu 179a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu#include "util/base/logging_raw.h" 189a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu 199a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu#include <stdio.h> 209a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu#include <string> 219a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu 229a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu// NOTE: this file contains two implementations: one for Android, one for all 239a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu// other cases. We always build exactly one implementation. 249a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu#if defined(__ANDROID__) 259a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu 269a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu// Compiled as part of Android. 279a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu#include <android/log.h> 289a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu 299a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianunamespace libtextclassifier { 309a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianunamespace logging { 319a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu 329a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianunamespace { 339a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu// Converts LogSeverity to level for __android_log_write. 349a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianuint GetAndroidLogLevel(LogSeverity severity) { 359a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu switch (severity) { 369a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu case FATAL: 379a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu return ANDROID_LOG_FATAL; 389a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu case ERROR: 399a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu return ANDROID_LOG_ERROR; 409a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu case WARNING: 419a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu return ANDROID_LOG_WARN; 429a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu case INFO: 439a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu return ANDROID_LOG_INFO; 449a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu default: 459a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu return ANDROID_LOG_DEBUG; 469a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu } 479a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu} 489a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu} // namespace 499a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu 509a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianuvoid LowLevelLogging(LogSeverity severity, const std::string& tag, 519a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu const std::string& message) { 529a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu const int android_log_level = GetAndroidLogLevel(severity); 5344742a4b41edae592b539b6a7890a2ea3f861211Matt Sharifi#if !defined(TC_DEBUG_LOGGING) 5444742a4b41edae592b539b6a7890a2ea3f861211Matt Sharifi if (android_log_level != ANDROID_LOG_ERROR && 5544742a4b41edae592b539b6a7890a2ea3f861211Matt Sharifi android_log_level != ANDROID_LOG_FATAL) { 5644742a4b41edae592b539b6a7890a2ea3f861211Matt Sharifi return; 5744742a4b41edae592b539b6a7890a2ea3f861211Matt Sharifi } 5844742a4b41edae592b539b6a7890a2ea3f861211Matt Sharifi#endif 599a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu __android_log_write(android_log_level, tag.c_str(), message.c_str()); 609a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu} 619a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu 629a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu} // namespace logging 639a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu} // namespace libtextclassifier 649a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu 659a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu#else // if defined(__ANDROID__) 669a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu 679a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu// Not on Android: implement LowLevelLogging to print to stderr (see below). 689a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianunamespace libtextclassifier { 699a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianunamespace logging { 709a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu 719a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianunamespace { 729a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu// Converts LogSeverity to human-readable text. 739a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianuconst char *LogSeverityToString(LogSeverity severity) { 749a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu switch (severity) { 759a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu case INFO: 769a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu return "INFO"; 779a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu case WARNING: 789a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu return "WARNING"; 799a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu case ERROR: 809a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu return "ERROR"; 819a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu case FATAL: 829a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu return "FATAL"; 839a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu default: 849a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu return "UNKNOWN"; 859a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu } 869a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu} 879a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu} // namespace 889a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu 899a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianuvoid LowLevelLogging(LogSeverity severity, const std::string &tag, 909a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu const std::string &message) { 919a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu fprintf(stderr, "[%s] %s : %s\n", LogSeverityToString(severity), tag.c_str(), 929a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu message.c_str()); 939a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu fflush(stderr); 949a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu} 959a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu 969a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu} // namespace logging 979a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu} // namespace libtextclassifier 989a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu 999a2fe7af3672216ebc5febb7127cd18cfaeb5caeAlex Salcianu#endif // if defined(__ANDROID__) 100