common: logging: Implement Android logcat backend.

This commit is contained in:
bunnei 2022-12-17 23:31:09 -08:00
parent afdee9abea
commit 99296a1510
3 changed files with 63 additions and 0 deletions

View File

@ -155,6 +155,26 @@ public:
void EnableForStacktrace() override {} void EnableForStacktrace() override {}
}; };
#ifdef ANDROID
/**
* Backend that writes to the Android logcat
*/
class LogcatBackend : public Backend {
public:
explicit LogcatBackend() = default;
~LogcatBackend() override = default;
void Write(const Entry& entry) override {
PrintMessageToLogcat(entry);
}
void Flush() override {}
void EnableForStacktrace() override {}
};
#endif
bool initialization_in_progress_suppress_logging = true; bool initialization_in_progress_suppress_logging = true;
/** /**
@ -260,6 +280,9 @@ private:
lambda(static_cast<Backend&>(debugger_backend)); lambda(static_cast<Backend&>(debugger_backend));
lambda(static_cast<Backend&>(color_console_backend)); lambda(static_cast<Backend&>(color_console_backend));
lambda(static_cast<Backend&>(file_backend)); lambda(static_cast<Backend&>(file_backend));
#ifdef ANDROID
lambda(static_cast<Backend&>(lc_backend));
#endif
} }
static void Deleter(Impl* ptr) { static void Deleter(Impl* ptr) {
@ -272,6 +295,9 @@ private:
DebuggerBackend debugger_backend{}; DebuggerBackend debugger_backend{};
ColorConsoleBackend color_console_backend{}; ColorConsoleBackend color_console_backend{};
FileBackend file_backend; FileBackend file_backend;
#ifdef ANDROID
LogcatBackend lc_backend{};
#endif
MPSCQueue<Entry> message_queue{}; MPSCQueue<Entry> message_queue{};
std::chrono::steady_clock::time_point time_origin{std::chrono::steady_clock::now()}; std::chrono::steady_clock::time_point time_origin{std::chrono::steady_clock::now()};

View File

@ -8,6 +8,10 @@
#include <windows.h> #include <windows.h>
#endif #endif
#ifdef ANDROID
#include <android/log.h>
#endif
#include "common/assert.h" #include "common/assert.h"
#include "common/logging/filter.h" #include "common/logging/filter.h"
#include "common/logging/log.h" #include "common/logging/log.h"
@ -106,4 +110,35 @@ void PrintColoredMessage(const Entry& entry) {
#undef ESC #undef ESC
#endif #endif
} }
void PrintMessageToLogcat(const Entry& entry) {
#ifdef ANDROID
const auto str = FormatLogMessage(entry);
android_LogPriority android_log_priority;
switch (entry.log_level) {
case Level::Trace:
android_log_priority = ANDROID_LOG_VERBOSE;
break;
case Level::Debug:
android_log_priority = ANDROID_LOG_DEBUG;
break;
case Level::Info:
android_log_priority = ANDROID_LOG_INFO;
break;
case Level::Warning:
android_log_priority = ANDROID_LOG_WARN;
break;
case Level::Error:
android_log_priority = ANDROID_LOG_ERROR;
break;
case Level::Critical:
android_log_priority = ANDROID_LOG_FATAL;
break;
case Level::Count:
UNREACHABLE();
}
__android_log_print(android_log_priority, "CitraNative", "%s", str.c_str());
#endif
}
} // namespace Common::Log } // namespace Common::Log

View File

@ -15,4 +15,6 @@ std::string FormatLogMessage(const Entry& entry);
void PrintMessage(const Entry& entry); void PrintMessage(const Entry& entry);
/// Prints the same message as `PrintMessage`, but colored according to the severity level. /// Prints the same message as `PrintMessage`, but colored according to the severity level.
void PrintColoredMessage(const Entry& entry); void PrintColoredMessage(const Entry& entry);
/// Formats and prints a log entry to the android logcat.
void PrintMessageToLogcat(const Entry& entry);
} // namespace Common::Log } // namespace Common::Log