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