common: logging: Implement Android logcat backend.
This commit is contained in:
		@@ -155,6 +155,26 @@ public:
 | 
			
		||||
    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;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -260,6 +280,9 @@ private:
 | 
			
		||||
        lambda(static_cast<Backend&>(debugger_backend));
 | 
			
		||||
        lambda(static_cast<Backend&>(color_console_backend));
 | 
			
		||||
        lambda(static_cast<Backend&>(file_backend));
 | 
			
		||||
#ifdef ANDROID
 | 
			
		||||
        lambda(static_cast<Backend&>(lc_backend));
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static void Deleter(Impl* ptr) {
 | 
			
		||||
@@ -272,6 +295,9 @@ private:
 | 
			
		||||
    DebuggerBackend debugger_backend{};
 | 
			
		||||
    ColorConsoleBackend color_console_backend{};
 | 
			
		||||
    FileBackend file_backend;
 | 
			
		||||
#ifdef ANDROID
 | 
			
		||||
    LogcatBackend lc_backend{};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    MPSCQueue<Entry> message_queue{};
 | 
			
		||||
    std::chrono::steady_clock::time_point time_origin{std::chrono::steady_clock::now()};
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,10 @@
 | 
			
		||||
#include <windows.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef ANDROID
 | 
			
		||||
#include <android/log.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "common/assert.h"
 | 
			
		||||
#include "common/logging/filter.h"
 | 
			
		||||
#include "common/logging/log.h"
 | 
			
		||||
@@ -106,4 +110,35 @@ void PrintColoredMessage(const Entry& entry) {
 | 
			
		||||
#undef ESC
 | 
			
		||||
#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
 | 
			
		||||
 
 | 
			
		||||
@@ -15,4 +15,6 @@ std::string FormatLogMessage(const Entry& entry);
 | 
			
		||||
void PrintMessage(const Entry& entry);
 | 
			
		||||
/// Prints the same message as `PrintMessage`, but colored according to the severity level.
 | 
			
		||||
void PrintColoredMessage(const Entry& entry);
 | 
			
		||||
/// Formats and prints a log entry to the android logcat.
 | 
			
		||||
void PrintMessageToLogcat(const Entry& entry);
 | 
			
		||||
} // namespace Common::Log
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user