summaryrefslogtreecommitdiffstats
path: root/src/common/logging
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/common/logging/backend.cpp26
-rw-r--r--src/common/logging/text_formatter.cpp35
-rw-r--r--src/common/logging/text_formatter.h2
3 files changed, 63 insertions, 0 deletions
diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp
index f96c7c222..6e8e8eb36 100644
--- a/src/common/logging/backend.cpp
+++ b/src/common/logging/backend.cpp
@@ -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()};
diff --git a/src/common/logging/text_formatter.cpp b/src/common/logging/text_formatter.cpp
index 09398ea64..2c453177b 100644
--- a/src/common/logging/text_formatter.cpp
+++ b/src/common/logging/text_formatter.cpp
@@ -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, "YuzuNative", "%s", str.c_str());
+#endif
+}
} // namespace Common::Log
diff --git a/src/common/logging/text_formatter.h b/src/common/logging/text_formatter.h
index 0d0ec4370..68417420b 100644
--- a/src/common/logging/text_formatter.h
+++ b/src/common/logging/text_formatter.h
@@ -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