diff --git a/include/spdlog/sinks/android_sink.h b/include/spdlog/sinks/android_sink.h index 885f78da..adde3c68 100644 --- a/include/spdlog/sinks/android_sink.h +++ b/include/spdlog/sinks/android_sink.h @@ -7,51 +7,42 @@ #if defined(__ANDROID__) -#include -#include - -#include +#include #include #include +#include namespace spdlog { namespace sinks { + /* * Android sink (logging using __android_log_write) +* __android_log_write is thread-safe. No lock is needed. */ -template -class base_android_sink : public base_sink < Mutex > +class android_sink : public sink { public: - explicit base_android_sink(std::string tag="spdlog"): _tag(tag) + explicit android_sink(const std::string& tag = "spdlog"): _tag(tag) {} + + void log(const details::log_msg& msg) override { + const android_LogPriority priority = convert_to_android(msg.level); + // See system/core/liblog/logger_write.c for explanation of return value + const int ret = __android_log_write( + priority, _tag.c_str(), msg.formatted.c_str() + ); + if (ret < 0) { + throw spdlog_ex("__android_log_write() failed", ret); + } } void flush() override { } -protected: - void _sink_it(const details::log_msg& msg) override - { - const android_LogPriority priority = convert_to_android(msg.level); - const int expected_size = msg.formatted.size(); - const int size = __android_log_write( - priority, _tag.c_str(), msg.formatted.c_str() - ); - if (size > expected_size) - { - // Will write a little bit more than original message - } - else - { - throw spdlog_ex("Send to Android logcat failed"); - } - } - private: static android_LogPriority convert_to_android(spdlog::level::level_enum level) { @@ -63,29 +54,20 @@ private: return ANDROID_LOG_DEBUG; case spdlog::level::info: return ANDROID_LOG_INFO; - case spdlog::level::notice: - 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; - case spdlog::level::alert: - return ANDROID_LOG_FATAL; - case spdlog::level::emerg: - return ANDROID_LOG_FATAL; default: - throw spdlog_ex("Incorrect level value"); + return ANDROID_LOG_DEFAULT; } } std::string _tag; }; -typedef base_android_sink android_sink_mt; -typedef base_android_sink android_sink_st; - } }