diff --git a/CMakeLists.txt b/CMakeLists.txt index 3aa64540..efe70ef6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,11 +73,19 @@ message(STATUS "Build type: " ${CMAKE_BUILD_TYPE}) #--------------------------------------------------------------------------------------- # Static/Shared library (shared not supported in windows yet) #--------------------------------------------------------------------------------------- +set(SPDLOG_SRCS + src/spdlog.cpp + src/stdout_sinks.cpp + src/fmt.cpp + src/color_sinks.cpp + src/file_sinks.cpp + src/async.cpp) + if (BUILD_SHARED_LIBS AND WIN32) message(WARNING "shared libs is not supported in spdlog - building static instead") - add_library(spdlog STATIC src/spdlog.cpp ${SPDLOG_ALL_HEADERS}) + add_library(spdlog STATIC ${SPDLOG_SRCS} ${SPDLOG_ALL_HEADERS}) else() - add_library(spdlog src/spdlog.cpp ${SPDLOG_ALL_HEADERS}) + add_library(spdlog ${SPDLOG_SRCS} ${SPDLOG_ALL_HEADERS}) endif() add_library(spdlog::spdlog ALIAS spdlog) diff --git a/example/example.cpp b/example/example.cpp index ae0116a2..ba8c3b1f 100644 --- a/example/example.cpp +++ b/example/example.cpp @@ -6,18 +6,6 @@ #include -void stdout_logger_example(); -void basic_example(); -void rotating_example(); -void daily_example(); -void async_example(); -void binary_example(); -void trace_example(); -void multi_sink_example(); -void user_defined_example(); -void err_handler_example(); -void syslog_example(); - #include "spdlog/spdlog.h" int main(int, char *[]) @@ -28,207 +16,4 @@ int main(int, char *[]) spdlog::info("Support for floats {:03.2f}", 1.23456); spdlog::info("Positional args are {1} {0}..", "too", "supported"); spdlog::info("{:>8} aligned, {:<8} aligned", "right", "left"); - - // Runtime log levels - spdlog::set_level(spdlog::level::info); // Set global log level to info - spdlog::debug("This message should not be displayed!"); - spdlog::set_level(spdlog::level::trace); // Set specific logger's log level - spdlog::debug("This message should be displayed.."); - - // Customize msg format for all loggers - spdlog::set_pattern("[%H:%M:%S %z] [%^%L%$] [thread %t] %v"); - spdlog::info("This an info message with custom format"); - spdlog::set_pattern("%+"); // back to default format - spdlog::set_level(spdlog::level::info); - - // Backtrace support - // Loggers can store in a ring buffer all messages (including debug/trace) for later inspection. - // When needed, call dump_backtrace() to see what happened: - spdlog::enable_backtrace(10); // create ring buffer to store latest 10 messages - for (int i = 0; i < 100; i++) - { - spdlog::debug("Backtrace message {}", i); // not logged.. - } - // e.g. if some error happened: - spdlog::dump_backtrace(); // log them now! - - try - { - stdout_logger_example(); - basic_example(); - rotating_example(); - daily_example(); - async_example(); - binary_example(); - multi_sink_example(); - user_defined_example(); - err_handler_example(); - trace_example(); - - // Flush all *registered* loggers using a worker thread every 3 seconds. - // note: registered loggers *must* be thread safe for this to work correctly! - spdlog::flush_every(std::chrono::seconds(3)); - - // Apply some function on all registered loggers - spdlog::apply_all([&](std::shared_ptr l) { l->info("End of example."); }); - - // Release all spdlog resources, and drop all loggers in the registry. - // This is optional (only mandatory if using windows + async log). - spdlog::shutdown(); - } - - // Exceptions will only be thrown upon failed logger or sink construction (not during logging). - catch (const spdlog::spdlog_ex &ex) - { - std::printf("Log initialization failed: %s\n", ex.what()); - return 1; - } -} - -#include "spdlog/sinks/stdout_color_sinks.h" -// or #include "spdlog/sinks/stdout_sinks.h" if no colors needed. -void stdout_logger_example() -{ - // Create color multi threaded logger. - auto console = spdlog::stdout_color_mt("console"); - // or for stderr: - // auto console = spdlog::stderr_color_mt("error-logger"); -} - -#include "spdlog/sinks/basic_file_sink.h" -void basic_example() -{ - // Create basic file logger (not rotated). - auto my_logger = spdlog::basic_logger_mt("file_logger", "logs/basic-log.txt"); -} - -#include "spdlog/sinks/rotating_file_sink.h" -void rotating_example() -{ - // Create a file rotating logger with 5mb size max and 3 rotated files. - auto rotating_logger = spdlog::rotating_logger_mt("some_logger_name", "logs/rotating.txt", 1048576 * 5, 3); -} - -#include "spdlog/sinks/daily_file_sink.h" -void daily_example() -{ - // Create a daily logger - a new file is created every day on 2:30am. - auto daily_logger = spdlog::daily_logger_mt("daily_logger", "logs/daily.txt", 2, 30); -} - -#include "spdlog/async.h" -void async_example() -{ - // Default thread pool settings can be modified *before* creating the async logger: - // spdlog::init_thread_pool(32768, 1); // queue with max 32k items 1 backing thread. - auto async_file = spdlog::basic_logger_mt("async_file_logger", "logs/async_log.txt"); - // alternatively: - // auto async_file = spdlog::create_async("async_file_logger", "logs/async_log.txt"); - - for (int i = 1; i < 101; ++i) - { - async_file->info("Async message #{}", i); - } -} - -// Log binary data as hex. -// Many types of std::container types can be used. -// Iterator ranges are supported too. -// Format flags: -// {:X} - print in uppercase. -// {:s} - don't separate each byte with space. -// {:p} - don't print the position on each line start. -// {:n} - don't split the output to lines. - -#include "spdlog/fmt/bin_to_hex.h" -void binary_example() -{ - std::vector buf; - for (int i = 0; i < 80; i++) - { - buf.push_back(static_cast(i & 0xff)); - } - spdlog::info("Binary example: {}", spdlog::to_hex(buf)); - spdlog::info("Another binary example:{:n}", spdlog::to_hex(std::begin(buf), std::begin(buf) + 10)); - // more examples: - // logger->info("uppercase: {:X}", spdlog::to_hex(buf)); - // logger->info("uppercase, no delimiters: {:Xs}", spdlog::to_hex(buf)); - // logger->info("uppercase, no delimiters, no position info: {:Xsp}", spdlog::to_hex(buf)); -} - -// Compile time log levels. -// define SPDLOG_ACTIVE_LEVEL to required level (e.g. SPDLOG_LEVEL_TRACE) -void trace_example() -{ - // trace from default logger - SPDLOG_TRACE("Some trace message.. {} ,{}", 1, 3.23); - // debug from default logger - SPDLOG_DEBUG("Some debug message.. {} ,{}", 1, 3.23); - - // trace from logger object - auto logger = spdlog::get("file_logger"); - SPDLOG_LOGGER_TRACE(logger, "another trace message"); -} - -// A logger with multiple sinks (stdout and file) - each with a different format and log level. -void multi_sink_example() -{ - auto console_sink = std::make_shared(); - console_sink->set_level(spdlog::level::warn); - console_sink->set_pattern("[multi_sink_example] [%^%l%$] %v"); - - auto file_sink = std::make_shared("logs/multisink.txt", true); - file_sink->set_level(spdlog::level::trace); - - spdlog::logger logger("multi_sink", {console_sink, file_sink}); - logger.set_level(spdlog::level::debug); - logger.warn("this should appear in both console and file"); - logger.info("this message should not appear in the console, only in the file"); -} - -// User defined types logging by implementing operator<< -#include "spdlog/fmt/ostr.h" // must be included -struct my_type -{ - int i; - template - friend OStream &operator<<(OStream &os, const my_type &c) - { - return os << "[my_type i=" << c.i << "]"; - } -}; - -void user_defined_example() -{ - spdlog::info("user defined type: {}", my_type{14}); -} - -// Custom error handler. Will be triggered on log failure. -void err_handler_example() -{ - // can be set globally or per logger(logger->set_error_handler(..)) - spdlog::set_error_handler([](const std::string &msg) { printf("*** Custom log error handler: %s ***\n", msg.c_str()); }); -} - -// syslog example (linux/osx/freebsd) -#ifndef _WIN32 -#include "spdlog/sinks/syslog_sink.h" -void syslog_example() -{ - std::string ident = "spdlog-example"; - auto syslog_logger = spdlog::syslog_logger_mt("syslog", ident, LOG_PID); - syslog_logger->warn("This is warning that will end up in syslog."); -} -#endif - -// Android example. -#if defined(__ANDROID__) -#include "spdlog/sinks/android_sink.h" -void android_example() -{ - std::string tag = "spdlog-android"; - auto android_logger = spdlog::android_logger_mt("android", tag); - android_logger->critical("Use \"adb shell logcat\" to view this message."); -} - -#endif +} \ No newline at end of file diff --git a/include/spdlog/details/backtracer.h b/include/spdlog/details/backtracer.h index 19b4a0bb..cf813fe6 100644 --- a/include/spdlog/details/backtracer.h +++ b/include/spdlog/details/backtracer.h @@ -3,7 +3,6 @@ #pragma once - #include "spdlog/details/log_msg_buffer.h" #include "spdlog/details/circular_q.h" @@ -11,7 +10,6 @@ #include #include - // Store log messages in circular buffer. // Useful for storing debug data in case of error/warning happens. diff --git a/src/async.cpp b/src/async.cpp new file mode 100644 index 00000000..f9557a84 --- /dev/null +++ b/src/async.cpp @@ -0,0 +1,12 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#ifndef SPDLOG_COMPILED_LIB +#error Please define SPDLOG_COMPILED_LIB to compile this file. +#endif + +#include "spdlog/async.h" +#include "spdlog/async_logger-inl.h" +#include "spdlog/details/periodic_worker-inl.h" +#include "spdlog/details/thread_pool-inl.h" +template class spdlog::details::mpmc_blocking_queue; \ No newline at end of file diff --git a/src/color_sinks.cpp b/src/color_sinks.cpp new file mode 100644 index 00000000..3a335a77 --- /dev/null +++ b/src/color_sinks.cpp @@ -0,0 +1,47 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#ifndef SPDLOG_COMPILED_LIB +#error Please define SPDLOG_COMPILED_LIB to compile this file. +#endif + +#include + +#include "spdlog/details/null_mutex.h" +#include "spdlog/async.h" +// +// color sinks +// +#ifdef _WIN32 +#include "spdlog/sinks/wincolor_sink-inl.h" +template class spdlog::sinks::wincolor_sink; +template class spdlog::sinks::wincolor_sink; +template class spdlog::sinks::wincolor_stdout_sink; +template class spdlog::sinks::wincolor_stdout_sink; +template class spdlog::sinks::wincolor_stderr_sink; +template class spdlog::sinks::wincolor_stderr_sink; +#else +#include "spdlog/sinks/ansicolor_sink-inl.h" +template class spdlog::sinks::ansicolor_sink; +template class spdlog::sinks::ansicolor_sink; +template class spdlog::sinks::ansicolor_stdout_sink; +template class spdlog::sinks::ansicolor_stdout_sink; +template class spdlog::sinks::ansicolor_stderr_sink; +template class spdlog::sinks::ansicolor_stderr_sink; +#endif + +// factory methods for color loggers +#include "spdlog/sinks/stdout_color_sinks-inl.h" +template std::shared_ptr spdlog::stdout_color_mt( + const std::string &logger_name, color_mode mode); +template std::shared_ptr spdlog::stdout_color_st( + const std::string &logger_name, color_mode mode); +template std::shared_ptr spdlog::stderr_color_mt( + const std::string &logger_name, color_mode mode); +template std::shared_ptr spdlog::stderr_color_st( + const std::string &logger_name, color_mode mode); + +template std::shared_ptr spdlog::stdout_color_mt(const std::string &logger_name, color_mode mode); +template std::shared_ptr spdlog::stdout_color_st(const std::string &logger_name, color_mode mode); +template std::shared_ptr spdlog::stderr_color_mt(const std::string &logger_name, color_mode mode); +template std::shared_ptr spdlog::stderr_color_st(const std::string &logger_name, color_mode mode); diff --git a/src/file_sinks.cpp b/src/file_sinks.cpp new file mode 100644 index 00000000..deb91446 --- /dev/null +++ b/src/file_sinks.cpp @@ -0,0 +1,14 @@ +#include "spdlog/details/null_mutex.h" +#include "spdlog/async.h" + +#include "spdlog/sinks/base_sink-inl.h" +template class spdlog::sinks::base_sink; +template class spdlog::sinks::base_sink; + +#include "spdlog/sinks/basic_file_sink-inl.h" +template class spdlog::sinks::basic_file_sink; +template class spdlog::sinks::basic_file_sink; + +#include "spdlog/sinks/rotating_file_sink-inl.h" +template class spdlog::sinks::rotating_file_sink; +template class spdlog::sinks::rotating_file_sink; \ No newline at end of file diff --git a/src/fmt.cpp b/src/fmt.cpp new file mode 100644 index 00000000..62c68a6e --- /dev/null +++ b/src/fmt.cpp @@ -0,0 +1,38 @@ +#ifndef SPDLOG_COMPILED_LIB +#error Please define SPDLOG_COMPILED_LIB to compile this file. +#endif + +// Slightly modified version of fmt lib's format.cc source file. +// Copyright (c) 2012 - 2016, Victor Zverovich +// All rights reserved. + +#if !defined(SPDLOG_FMT_EXTERNAL) +#include "spdlog/fmt/bundled/format-inl.h" +#include "spdlog/details/file_helper-inl.h" + +FMT_BEGIN_NAMESPACE +template struct internal::basic_data; +template FMT_API internal::locale_ref::locale_ref(const std::locale &loc); +template FMT_API std::locale internal::locale_ref::get() const; + +// Explicit instantiations for char. +template FMT_API char internal::thousands_sep_impl(locale_ref); +template FMT_API void internal::basic_buffer::append(const char *, const char *); +template FMT_API void internal::arg_map::init(const basic_format_args &args); +template FMT_API int internal::char_traits::format_float(char *, std::size_t, const char *, int, double); +template FMT_API int internal::char_traits::format_float(char *, std::size_t, const char *, int, long double); +template FMT_API std::string internal::vformat(string_view, basic_format_args); +template FMT_API format_context::iterator internal::vformat_to(internal::buffer &, string_view, basic_format_args); +template FMT_API void internal::sprintf_format(double, internal::buffer &, core_format_specs); +template FMT_API void internal::sprintf_format(long double, internal::buffer &, core_format_specs); + +// Explicit instantiations for wchar_t. +template FMT_API wchar_t internal::thousands_sep_impl(locale_ref); +template FMT_API void internal::basic_buffer::append(const wchar_t *, const wchar_t *); +template FMT_API void internal::arg_map::init(const basic_format_args &); +template FMT_API int internal::char_traits::format_float(wchar_t *, std::size_t, const wchar_t *, int, double); +template FMT_API int internal::char_traits::format_float(wchar_t *, std::size_t, const wchar_t *, int, long double); +template FMT_API std::wstring internal::vformat(wstring_view, basic_format_args); +FMT_END_NAMESPACE + +#endif diff --git a/src/spdlog.cpp b/src/spdlog.cpp index fd591bbb..f8571537 100644 --- a/src/spdlog.cpp +++ b/src/spdlog.cpp @@ -5,129 +5,14 @@ #error Please define SPDLOG_COMPILED_LIB to compile this file. #endif -#include - -#include "spdlog/details/null_mutex.h" -#include "spdlog/async.h" - #include "spdlog/spdlog-inl.h" #include "spdlog/common-inl.h" #include "spdlog/details/backtracer-inl.h" -#include "spdlog/logger-inl.h" -template spdlog::logger::logger(std::string name, sinks_init_list::iterator begin, sinks_init_list::iterator end); - -#include "spdlog/async_logger-inl.h" +#include "spdlog/details/registry-inl.h" +#include "spdlog/details/os-inl.h" +#include "spdlog/details/pattern_formatter-inl.h" #include "spdlog/details/log_msg-inl.h" +#include "spdlog/logger-inl.h" #include "spdlog/sinks/sink-inl.h" -#include "spdlog/sinks/base_sink-inl.h" -template class spdlog::sinks::base_sink; -template class spdlog::sinks::base_sink; - -#include "spdlog/sinks/basic_file_sink-inl.h" -template class spdlog::sinks::basic_file_sink; -template class spdlog::sinks::basic_file_sink; - -#include "spdlog/sinks/rotating_file_sink-inl.h" -template class spdlog::sinks::rotating_file_sink; -template class spdlog::sinks::rotating_file_sink; - -#include "spdlog/details/registry-inl.h" - -#include "spdlog/details/os-inl.h" -#include "spdlog/details/periodic_worker-inl.h" -#include "spdlog/details/file_helper-inl.h" -#include "spdlog/details/pattern_formatter-inl.h" - -#include "spdlog/details/thread_pool-inl.h" -template class spdlog::details::mpmc_blocking_queue; - -// -// color sinks -// -#ifdef _WIN32 -#include "spdlog/sinks/wincolor_sink-inl.h" -template class spdlog::sinks::wincolor_sink; -template class spdlog::sinks::wincolor_sink; -template class spdlog::sinks::wincolor_stdout_sink; -template class spdlog::sinks::wincolor_stdout_sink; -template class spdlog::sinks::wincolor_stderr_sink; -template class spdlog::sinks::wincolor_stderr_sink; -#else -#include "spdlog/sinks/ansicolor_sink-inl.h" -template class spdlog::sinks::ansicolor_sink; -template class spdlog::sinks::ansicolor_sink; -template class spdlog::sinks::ansicolor_stdout_sink; -template class spdlog::sinks::ansicolor_stdout_sink; -template class spdlog::sinks::ansicolor_stderr_sink; -template class spdlog::sinks::ansicolor_stderr_sink; -#endif - -// factory methods for color loggers -#include "spdlog/sinks/stdout_color_sinks-inl.h" -template std::shared_ptr spdlog::stdout_color_mt( - const std::string &logger_name, color_mode mode); -template std::shared_ptr spdlog::stdout_color_st( - const std::string &logger_name, color_mode mode); -template std::shared_ptr spdlog::stderr_color_mt( - const std::string &logger_name, color_mode mode); -template std::shared_ptr spdlog::stderr_color_st( - const std::string &logger_name, color_mode mode); - -template std::shared_ptr spdlog::stdout_color_mt(const std::string &logger_name, color_mode mode); -template std::shared_ptr spdlog::stdout_color_st(const std::string &logger_name, color_mode mode); -template std::shared_ptr spdlog::stderr_color_mt(const std::string &logger_name, color_mode mode); -template std::shared_ptr spdlog::stderr_color_st(const std::string &logger_name, color_mode mode); - -#include "spdlog/sinks/stdout_sinks-inl.h" - -template class spdlog::sinks::stdout_sink_base; -template class spdlog::sinks::stdout_sink_base; -template class spdlog::sinks::stdout_sink; -template class spdlog::sinks::stdout_sink; -template class spdlog::sinks::stderr_sink; -template class spdlog::sinks::stderr_sink; - -template std::shared_ptr spdlog::stdout_logger_mt(const std::string &logger_name); -template std::shared_ptr spdlog::stdout_logger_st(const std::string &logger_name); -template std::shared_ptr spdlog::stderr_logger_mt(const std::string &logger_name); -template std::shared_ptr spdlog::stderr_logger_st(const std::string &logger_name); - -template std::shared_ptr spdlog::stdout_logger_mt(const std::string &logger_name); -template std::shared_ptr spdlog::stdout_logger_st(const std::string &logger_name); -template std::shared_ptr spdlog::stderr_logger_mt(const std::string &logger_name); -template std::shared_ptr spdlog::stderr_logger_st(const std::string &logger_name); - -// Slightly modified version of fmt lib's format.cc source file. -// Copyright (c) 2012 - 2016, Victor Zverovich -// All rights reserved. - -#if !defined(SPDLOG_FMT_EXTERNAL) -#include "spdlog/fmt/bundled/format-inl.h" - -FMT_BEGIN_NAMESPACE -template struct internal::basic_data; -template FMT_API internal::locale_ref::locale_ref(const std::locale &loc); -template FMT_API std::locale internal::locale_ref::get() const; - -// Explicit instantiations for char. -template FMT_API char internal::thousands_sep_impl(locale_ref); -template FMT_API void internal::basic_buffer::append(const char *, const char *); -template FMT_API void internal::arg_map::init(const basic_format_args &args); -template FMT_API int internal::char_traits::format_float(char *, std::size_t, const char *, int, double); -template FMT_API int internal::char_traits::format_float(char *, std::size_t, const char *, int, long double); -template FMT_API std::string internal::vformat(string_view, basic_format_args); -template FMT_API format_context::iterator internal::vformat_to(internal::buffer &, string_view, basic_format_args); -template FMT_API void internal::sprintf_format(double, internal::buffer &, core_format_specs); -template FMT_API void internal::sprintf_format(long double, internal::buffer &, core_format_specs); - -// Explicit instantiations for wchar_t. -template FMT_API wchar_t internal::thousands_sep_impl(locale_ref); -template FMT_API void internal::basic_buffer::append(const wchar_t *, const wchar_t *); -template FMT_API void internal::arg_map::init(const basic_format_args &); -template FMT_API int internal::char_traits::format_float(wchar_t *, std::size_t, const wchar_t *, int, double); -template FMT_API int internal::char_traits::format_float(wchar_t *, std::size_t, const wchar_t *, int, long double); -template FMT_API std::wstring internal::vformat(wstring_view, basic_format_args); -FMT_END_NAMESPACE - -#endif +template spdlog::logger::logger(std::string name, sinks_init_list::iterator begin, sinks_init_list::iterator end); diff --git a/src/stdout_sinks.cpp b/src/stdout_sinks.cpp new file mode 100644 index 00000000..36d6699e --- /dev/null +++ b/src/stdout_sinks.cpp @@ -0,0 +1,29 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#ifndef SPDLOG_COMPILED_LIB +#error Please define SPDLOG_COMPILED_LIB to compile this file. +#endif + +#include + +#include "spdlog/details/null_mutex.h" +#include "spdlog/async.h" +#include "spdlog/sinks/stdout_sinks-inl.h" + +template class spdlog::sinks::stdout_sink_base; +template class spdlog::sinks::stdout_sink_base; +template class spdlog::sinks::stdout_sink; +template class spdlog::sinks::stdout_sink; +template class spdlog::sinks::stderr_sink; +template class spdlog::sinks::stderr_sink; + +template std::shared_ptr spdlog::stdout_logger_mt(const std::string &logger_name); +template std::shared_ptr spdlog::stdout_logger_st(const std::string &logger_name); +template std::shared_ptr spdlog::stderr_logger_mt(const std::string &logger_name); +template std::shared_ptr spdlog::stderr_logger_st(const std::string &logger_name); + +template std::shared_ptr spdlog::stdout_logger_mt(const std::string &logger_name); +template std::shared_ptr spdlog::stdout_logger_st(const std::string &logger_name); +template std::shared_ptr spdlog::stderr_logger_mt(const std::string &logger_name); +template std::shared_ptr spdlog::stderr_logger_st(const std::string &logger_name); \ No newline at end of file