diff options
| author | 2022-12-17 23:31:09 -0800 | |
|---|---|---|
| committer | 2023-06-03 00:05:26 -0700 | |
| commit | 99296a15108f950c60c7864a374e3ef1f5909e76 (patch) | |
| tree | 6189575f5e74f658d3181fdd2467bf894a5bf940 | |
| parent | common: host_memory: Implement for Android. (diff) | |
| download | yuzu-99296a15108f950c60c7864a374e3ef1f5909e76.tar.gz yuzu-99296a15108f950c60c7864a374e3ef1f5909e76.tar.xz yuzu-99296a15108f950c60c7864a374e3ef1f5909e76.zip | |
common: logging: Implement Android logcat backend.
Diffstat (limited to '')
| -rw-r--r-- | src/common/logging/backend.cpp | 26 | ||||
| -rw-r--r-- | src/common/logging/text_formatter.cpp | 35 | ||||
| -rw-r--r-- | src/common/logging/text_formatter.h | 2 |
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: | |||
| 155 | void EnableForStacktrace() override {} | 155 | void EnableForStacktrace() override {} |
| 156 | }; | 156 | }; |
| 157 | 157 | ||
| 158 | #ifdef ANDROID | ||
| 159 | /** | ||
| 160 | * Backend that writes to the Android logcat | ||
| 161 | */ | ||
| 162 | class LogcatBackend : public Backend { | ||
| 163 | public: | ||
| 164 | explicit LogcatBackend() = default; | ||
| 165 | |||
| 166 | ~LogcatBackend() override = default; | ||
| 167 | |||
| 168 | void Write(const Entry& entry) override { | ||
| 169 | PrintMessageToLogcat(entry); | ||
| 170 | } | ||
| 171 | |||
| 172 | void Flush() override {} | ||
| 173 | |||
| 174 | void EnableForStacktrace() override {} | ||
| 175 | }; | ||
| 176 | #endif | ||
| 177 | |||
| 158 | bool initialization_in_progress_suppress_logging = true; | 178 | bool initialization_in_progress_suppress_logging = true; |
| 159 | 179 | ||
| 160 | /** | 180 | /** |
| @@ -260,6 +280,9 @@ private: | |||
| 260 | lambda(static_cast<Backend&>(debugger_backend)); | 280 | lambda(static_cast<Backend&>(debugger_backend)); |
| 261 | lambda(static_cast<Backend&>(color_console_backend)); | 281 | lambda(static_cast<Backend&>(color_console_backend)); |
| 262 | lambda(static_cast<Backend&>(file_backend)); | 282 | lambda(static_cast<Backend&>(file_backend)); |
| 283 | #ifdef ANDROID | ||
| 284 | lambda(static_cast<Backend&>(lc_backend)); | ||
| 285 | #endif | ||
| 263 | } | 286 | } |
| 264 | 287 | ||
| 265 | static void Deleter(Impl* ptr) { | 288 | static void Deleter(Impl* ptr) { |
| @@ -272,6 +295,9 @@ private: | |||
| 272 | DebuggerBackend debugger_backend{}; | 295 | DebuggerBackend debugger_backend{}; |
| 273 | ColorConsoleBackend color_console_backend{}; | 296 | ColorConsoleBackend color_console_backend{}; |
| 274 | FileBackend file_backend; | 297 | FileBackend file_backend; |
| 298 | #ifdef ANDROID | ||
| 299 | LogcatBackend lc_backend{}; | ||
| 300 | #endif | ||
| 275 | 301 | ||
| 276 | MPSCQueue<Entry> message_queue{}; | 302 | MPSCQueue<Entry> message_queue{}; |
| 277 | std::chrono::steady_clock::time_point time_origin{std::chrono::steady_clock::now()}; | 303 | 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..709f610a3 100644 --- a/src/common/logging/text_formatter.cpp +++ b/src/common/logging/text_formatter.cpp | |||
| @@ -8,6 +8,10 @@ | |||
| 8 | #include <windows.h> | 8 | #include <windows.h> |
| 9 | #endif | 9 | #endif |
| 10 | 10 | ||
| 11 | #ifdef ANDROID | ||
| 12 | #include <android/log.h> | ||
| 13 | #endif | ||
| 14 | |||
| 11 | #include "common/assert.h" | 15 | #include "common/assert.h" |
| 12 | #include "common/logging/filter.h" | 16 | #include "common/logging/filter.h" |
| 13 | #include "common/logging/log.h" | 17 | #include "common/logging/log.h" |
| @@ -106,4 +110,35 @@ void PrintColoredMessage(const Entry& entry) { | |||
| 106 | #undef ESC | 110 | #undef ESC |
| 107 | #endif | 111 | #endif |
| 108 | } | 112 | } |
| 113 | |||
| 114 | void PrintMessageToLogcat(const Entry& entry) { | ||
| 115 | #ifdef ANDROID | ||
| 116 | const auto str = FormatLogMessage(entry); | ||
| 117 | |||
| 118 | android_LogPriority android_log_priority; | ||
| 119 | switch (entry.log_level) { | ||
| 120 | case Level::Trace: | ||
| 121 | android_log_priority = ANDROID_LOG_VERBOSE; | ||
| 122 | break; | ||
| 123 | case Level::Debug: | ||
| 124 | android_log_priority = ANDROID_LOG_DEBUG; | ||
| 125 | break; | ||
| 126 | case Level::Info: | ||
| 127 | android_log_priority = ANDROID_LOG_INFO; | ||
| 128 | break; | ||
| 129 | case Level::Warning: | ||
| 130 | android_log_priority = ANDROID_LOG_WARN; | ||
| 131 | break; | ||
| 132 | case Level::Error: | ||
| 133 | android_log_priority = ANDROID_LOG_ERROR; | ||
| 134 | break; | ||
| 135 | case Level::Critical: | ||
| 136 | android_log_priority = ANDROID_LOG_FATAL; | ||
| 137 | break; | ||
| 138 | case Level::Count: | ||
| 139 | UNREACHABLE(); | ||
| 140 | } | ||
| 141 | __android_log_print(android_log_priority, "CitraNative", "%s", str.c_str()); | ||
| 142 | #endif | ||
| 143 | } | ||
| 109 | } // namespace Common::Log | 144 | } // 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); | |||
| 15 | void PrintMessage(const Entry& entry); | 15 | void PrintMessage(const Entry& entry); |
| 16 | /// Prints the same message as `PrintMessage`, but colored according to the severity level. | 16 | /// Prints the same message as `PrintMessage`, but colored according to the severity level. |
| 17 | void PrintColoredMessage(const Entry& entry); | 17 | void PrintColoredMessage(const Entry& entry); |
| 18 | /// Formats and prints a log entry to the android logcat. | ||
| 19 | void PrintMessageToLogcat(const Entry& entry); | ||
| 18 | } // namespace Common::Log | 20 | } // namespace Common::Log |