summaryrefslogtreecommitdiff
path: root/lib/spdlog/sinks/android_sink.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/spdlog/sinks/android_sink.h')
-rw-r--r--lib/spdlog/sinks/android_sink.h91
1 files changed, 91 insertions, 0 deletions
diff --git a/lib/spdlog/sinks/android_sink.h b/lib/spdlog/sinks/android_sink.h
new file mode 100644
index 0000000..dd81163
--- /dev/null
+++ b/lib/spdlog/sinks/android_sink.h
@@ -0,0 +1,91 @@
+//
+// Copyright(c) 2015 Gabi Melman.
+// Distributed under the MIT License (http://opensource.org/licenses/MIT)
+//
+
+#pragma once
+
+#if defined(__ANDROID__)
+
+#include "../details/os.h"
+#include "sink.h"
+
+#include <android/log.h>
+#include <chrono>
+#include <mutex>
+#include <string>
+#include <thread>
+
+#if !defined(SPDLOG_ANDROID_RETRIES)
+#define SPDLOG_ANDROID_RETRIES 2
+#endif
+
+namespace spdlog {
+namespace sinks {
+
+/*
+ * Android sink (logging using __android_log_write)
+ * __android_log_write is thread-safe. No lock is needed.
+ */
+class android_sink : public sink
+{
+public:
+ explicit android_sink(const std::string &tag = "spdlog", bool use_raw_msg = false)
+ : _tag(tag)
+ , _use_raw_msg(use_raw_msg)
+ {
+ }
+
+ void log(const details::log_msg &msg) override
+ {
+ const android_LogPriority priority = convert_to_android(msg.level);
+ const char *msg_output = (_use_raw_msg ? msg.raw.c_str() : msg.formatted.c_str());
+
+ // See system/core/liblog/logger_write.c for explanation of return value
+ int ret = __android_log_write(priority, _tag.c_str(), msg_output);
+ int retry_count = 0;
+ while ((ret == -11 /*EAGAIN*/) && (retry_count < SPDLOG_ANDROID_RETRIES))
+ {
+ details::os::sleep_for_millis(5);
+ ret = __android_log_write(priority, _tag.c_str(), msg_output);
+ retry_count++;
+ }
+
+ if (ret < 0)
+ {
+ throw spdlog_ex("__android_log_write() failed", ret);
+ }
+ }
+
+ void flush() override {}
+
+private:
+ static android_LogPriority convert_to_android(spdlog::level::level_enum level)
+ {
+ switch (level)
+ {
+ case spdlog::level::trace:
+ return ANDROID_LOG_VERBOSE;
+ case spdlog::level::debug:
+ return ANDROID_LOG_DEBUG;
+ case spdlog::level::info:
+ return ANDROID_LOG_INFO;
+ case spdlog::level::warn:
+ return ANDROID_LOG_WARN;
+ case spdlog::level::err:
+ return ANDROID_LOG_ERROR;
+ case spdlog::level::critical:
+ return ANDROID_LOG_FATAL;
+ default:
+ return ANDROID_LOG_DEFAULT;
+ }
+ }
+
+ std::string _tag;
+ bool _use_raw_msg;
+};
+
+} // namespace sinks
+} // namespace spdlog
+
+#endif