Add formatting option to syslog in ctor. Fix issue #729 #1107

This commit is contained in:
gabime 2019-06-19 00:52:38 +03:00
parent f0fcc73f92
commit e68cf1c9ed

View File

@ -13,16 +13,15 @@ namespace spdlog {
namespace sinks { namespace sinks {
/** /**
* Sink that write to syslog using the `syscall()` library call. * Sink that write to syslog using the `syscall()` library call.
*
* Locking is not needed, as `syslog()` itself is thread-safe.
*/ */
template<typename Mutex> template<typename Mutex>
class syslog_sink : public base_sink<Mutex> class syslog_sink : public base_sink<Mutex>
{ {
public: public:
// syslog_sink(std::string ident, int syslog_option, int syslog_facility, bool enable_formatting):
explicit syslog_sink(std::string ident = "", int syslog_option = 0, int syslog_facility = LOG_USER) enable_formatting_{enable_formatting},
: ident_(std::move(ident)) ident_{std::move(ident)}
{ {
priorities_[static_cast<size_t>(level::trace)] = LOG_DEBUG; priorities_[static_cast<size_t>(level::trace)] = LOG_DEBUG;
priorities_[static_cast<size_t>(level::debug)] = LOG_DEBUG; priorities_[static_cast<size_t>(level::debug)] = LOG_DEBUG;
@ -47,10 +46,24 @@ public:
protected: protected:
void sink_it_(const details::log_msg &msg) override void sink_it_(const details::log_msg &msg) override
{ {
::syslog(syslog_prio_from_level(msg), "%s", fmt::to_string(msg.payload).c_str()); string_view_t payload;
if(enable_formatting_)
{
fmt::memory_buffer formatted;
sink::formatter_->format(msg, formatted);
payload = string_view_t(formatted.data(), formatted.size());
}
else
{
payload = msg.payload;
}
::syslog(syslog_prio_from_level(msg), "%s", payload.data());
} }
void flush_() override {} void flush_() override {}
bool enable_formatting_ = false;
private: private:
std::array<int, 7> priorities_; std::array<int, 7> priorities_;
@ -74,15 +87,23 @@ using syslog_sink_st = syslog_sink<details::null_mutex>;
// Create and register a syslog logger // Create and register a syslog logger
template<typename Factory = default_factory> template<typename Factory = default_factory>
inline std::shared_ptr<logger> syslog_logger_mt( inline std::shared_ptr<logger> syslog_logger_mt(
const std::string &logger_name, const std::string &syslog_ident = "", int syslog_option = 0, int syslog_facility = (1 << 3)) const std::string &logger_name,
const std::string &syslog_ident = "",
int syslog_option = 0,
int syslog_facility = LOG_USER,
bool enable_formatting = false)
{ {
return Factory::template create<sinks::syslog_sink_mt>(logger_name, syslog_ident, syslog_option, syslog_facility); return Factory::template create<sinks::syslog_sink_mt>(logger_name, syslog_ident, syslog_option, syslog_facility, enable_formatting);
} }
template<typename Factory = default_factory> template<typename Factory = default_factory>
inline std::shared_ptr<logger> syslog_logger_st( inline std::shared_ptr<logger> syslog_logger_st(
const std::string &logger_name, const std::string &syslog_ident = "", int syslog_option = 0, int syslog_facility = (1 << 3)) const std::string &logger_name,
const std::string &syslog_ident = "",
int syslog_option = 0,
int syslog_facility = LOG_USER,
bool enable_formatting = false)
{ {
return Factory::template create<sinks::syslog_sink_st>(logger_name, syslog_ident, syslog_option, syslog_facility); return Factory::template create<sinks::syslog_sink_st>(logger_name, syslog_ident, syslog_option, syslog_facility, enable_formatting);
} }
} // namespace spdlog } // namespace spdlog