From f2c969243863fad3ba1aed62c5d3acb5db48c84e Mon Sep 17 00:00:00 2001 From: Hugh Wang Date: Tue, 13 Sep 2016 10:19:26 +0800 Subject: [PATCH 1/4] Fix compilation on Android. --- include/spdlog/details/os.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/spdlog/details/os.h b/include/spdlog/details/os.h index eb95e44a..ed4f45cd 100644 --- a/include/spdlog/details/os.h +++ b/include/spdlog/details/os.h @@ -342,7 +342,9 @@ inline std::string errno_str(int err_num) else return "Unkown error"; -#elif defined(__FreeBSD__) || defined(__APPLE__) || ((_POSIX_C_SOURCE >= 200112L) && ! _GNU_SOURCE) // posix version +#elif defined(__FreeBSD__) || defined(__APPLE__) || defined(ANDROID) || \ + ((_POSIX_C_SOURCE >= 200112L) && ! _GNU_SOURCE) // posix version + if (strerror_r(err_num, buf, buf_size) == 0) return std::string(buf); else @@ -356,5 +358,3 @@ inline std::string errno_str(int err_num) } //os } //details } //spdlog - - From bf02f5747503a2658a8bfe592c1c5fa383346e8b Mon Sep 17 00:00:00 2001 From: Hugh Wang Date: Wed, 14 Sep 2016 17:05:40 +0800 Subject: [PATCH 2/4] Fix Android sink. 1. Remove lock. 2. Improve error detection. 3. Remove unsupported log levels. --- include/spdlog/sinks/android_sink.h | 52 ++++++++++------------------- 1 file changed, 17 insertions(+), 35 deletions(-) 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; - } } From 72a6fd65da618036edfc3be4ec3d74c0a1d8a04c Mon Sep 17 00:00:00 2001 From: Hugh Wang Date: Wed, 14 Sep 2016 17:08:42 +0800 Subject: [PATCH 3/4] Support direct creation of android logger. --- include/spdlog/details/spdlog_impl.h | 8 ++++++++ include/spdlog/spdlog.h | 3 +++ 2 files changed, 11 insertions(+) diff --git a/include/spdlog/details/spdlog_impl.h b/include/spdlog/details/spdlog_impl.h index b6c95825..16c1a901 100644 --- a/include/spdlog/details/spdlog_impl.h +++ b/include/spdlog/details/spdlog_impl.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -104,6 +105,13 @@ inline std::shared_ptr spdlog::syslog_logger(const std::string& } #endif +#if defined(__ANDROID__) +inline std::shared_ptr spdlog::android_logger(const std::string& logger_name, const std::string& tag) +{ + return create(logger_name, tag); +} +#endif + // Create and register a logger a single sink inline std::shared_ptr spdlog::create(const std::string& logger_name, const spdlog::sink_ptr& sink) { diff --git a/include/spdlog/spdlog.h b/include/spdlog/spdlog.h index dcb9f59e..35067629 100644 --- a/include/spdlog/spdlog.h +++ b/include/spdlog/spdlog.h @@ -101,6 +101,9 @@ std::shared_ptr stderr_logger_st(const std::string& logger_name, bool co std::shared_ptr syslog_logger(const std::string& logger_name, const std::string& ident = "", int syslog_option = 0); #endif +#if defined(__ANDROID__) +std::shared_ptr android_logger(const std::string& logger_name, const std::string& tag = "spdlog"); +#endif // Create and register a logger a single sink std::shared_ptr create(const std::string& logger_name, const sink_ptr& sink); From 96267654e6c2c592cd5a313aa3bc6358dc45e24b Mon Sep 17 00:00:00 2001 From: Hugh Wang Date: Wed, 14 Sep 2016 17:16:18 +0800 Subject: [PATCH 4/4] Add Android examples. --- .gitignore | 3 ++- example/example.cpp | 16 ++++++++++++++-- example/jni/Android.mk | 15 +++++++++++++++ example/jni/Application.mk | 2 ++ example/jni/example.cpp | 1 + 5 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 example/jni/Android.mk create mode 100644 example/jni/Application.mk create mode 120000 example/jni/example.cpp diff --git a/.gitignore b/.gitignore index 5524d609..b51a05b7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -# Auto generated files +# Auto generated files *.slo *.lo *.o @@ -46,6 +46,7 @@ example/* !example/example.vcxproj !example/CMakeLists.txt !example/multisink.cpp +!example/jni # generated files generated diff --git a/example/example.cpp b/example/example.cpp index 217d1433..2323b57d 100644 --- a/example/example.cpp +++ b/example/example.cpp @@ -13,6 +13,7 @@ void async_example(); void syslog_example(); +void android_example(); void user_defined_example(); void err_handler_example(); @@ -48,7 +49,6 @@ int main(int, char*[]) auto my_logger = spd::basic_logger_mt("basic_logger", "logs/basic.txt"); my_logger->info("Some log message"); - // Create a file rotating logger with 5mb size max and 3 rotated files auto rotating_logger = spd::rotating_logger_mt("some_logger_name", "logs/mylogfile", 1048576 * 5, 3); for (int i = 0; i < 10; ++i) @@ -76,6 +76,9 @@ int main(int, char*[]) // syslog example. linux/osx only syslog_example(); + // android example. compile with NDK + android_example(); + // Log user-defined types example user_defined_example(); @@ -119,6 +122,16 @@ void syslog_example() #endif } +// Android example +void android_example() +{ +#if defined(__ANDROID__) + std::string tag = "spdlog-android"; + auto android_logger = spd::android_logger("android", tag); + android_logger->critical("Use \"adb shell logcat\" to view this message."); +#endif +} + // user defined types logging by implementing operator<< struct my_type { @@ -148,4 +161,3 @@ void err_handler_example() }); spd::get("console")->info("some invalid message to trigger an error {}{}{}{}", 3); } - diff --git a/example/jni/Android.mk b/example/jni/Android.mk new file mode 100644 index 00000000..7accbad3 --- /dev/null +++ b/example/jni/Android.mk @@ -0,0 +1,15 @@ +# Setup a project +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE := example +LOCAL_SRC_FILES := example.cpp +LOCAL_CPPFLAGS += -Wall -Wshadow -Wextra -pedantic -std=c++11 -fPIE -pie +LOCAL_LDFLAGS += -fPIE -pie + +# Add exception support and set path for spdlog's headers +LOCAL_CPPFLAGS += -fexceptions -I../include +# Use android's log library +LOCAL_LDFLAGS += -llog + +include $(BUILD_EXECUTABLE) diff --git a/example/jni/Application.mk b/example/jni/Application.mk new file mode 100644 index 00000000..dccd2a5a --- /dev/null +++ b/example/jni/Application.mk @@ -0,0 +1,2 @@ +# Exceptions are used in spdlog. Link to an exception-ready C++ runtime. +APP_STL = gnustl_static diff --git a/example/jni/example.cpp b/example/jni/example.cpp new file mode 120000 index 00000000..6170abce --- /dev/null +++ b/example/jni/example.cpp @@ -0,0 +1 @@ +../example.cpp \ No newline at end of file