From: 胡玮文 Date: Wed, 3 Mar 2021 07:03:41 +0000 (+0800) Subject: common: enable sending cluster log to journald X-Git-Tag: v17.1.0~2374^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e05900b91184ab7d71bb2d727d87a568c29c5941;p=ceph.git common: enable sending cluster log to journald Use the same infrastructure used for local logs. Also with structured metadata. Signed-off-by: 胡玮文 --- diff --git a/src/common/Journald.cc b/src/common/Journald.cc index 6962f9630e0..ba3a84c06c5 100644 --- a/src/common/Journald.cc +++ b/src/common/Journald.cc @@ -119,6 +119,39 @@ MESSAGE } }; +class LogEntryEncoder : public EntryEncoderBase { + public: + void encode(const LogEntry& le) + { + meta_buf.clear(); + fmt::format_to(meta_buf, + R"(PRIORITY={:d} +TIMESTAMP={} +CEPH_NAME={} +CEPH_RANK={} +CEPH_SEQ={} +CEPH_CHANNEL={} +MESSAGE +)", + clog_type_to_syslog_level(le.prio), + le.stamp.to_nsec(), + le.name.to_str(), + le.rank, + le.seq, + le.channel); + + uint64_t msg_len = htole64(le.msg.size()); + meta_buf.resize(meta_buf.size() + sizeof(msg_len)); + *(reinterpret_cast(meta_buf.end()) - 1) = htole64(le.msg.size()); + + m_msg_vec[0].iov_base = meta_buf.data(); + m_msg_vec[0].iov_len = meta_buf.size(); + + m_msg_vec[1].iov_base = (void *)le.msg.data(); + m_msg_vec[1].iov_len = le.msg.size(); + } +}; + enum class JournaldClient::MemFileMode { MEMFD_CREATE, OPEN_TMPFILE, @@ -252,4 +285,19 @@ int JournaldLogger::log_entry(const Entry& e) return client.send(); } +JournaldClusterLogger::JournaldClusterLogger() : + m_log_entry_encoder(make_unique()) +{ + client.m_msghdr.msg_iov = m_log_entry_encoder->iovec(); + client.m_msghdr.msg_iovlen = m_log_entry_encoder->iovec_len(); +} + +JournaldClusterLogger::~JournaldClusterLogger() = default; + +int JournaldClusterLogger::log_log_entry(const LogEntry &le) +{ + m_log_entry_encoder->encode(le); + return client.send(); +} + } diff --git a/src/common/Journald.h b/src/common/Journald.h index 388d843a03d..59a9c4421a4 100644 --- a/src/common/Journald.h +++ b/src/common/Journald.h @@ -8,12 +8,15 @@ #include #include +struct LogEntry; + namespace ceph { namespace logging { namespace detail { class EntryEncoder; +class LogEntryEncoder; class JournaldClient { public: @@ -39,6 +42,8 @@ class SubsystemMap; * Logger to send local logs to journald * * local logs means @code dout(0) << ... @endcode and similars + * + * @see JournaldClusterLogger */ class JournaldLogger { public: @@ -58,6 +63,26 @@ class JournaldLogger { const SubsystemMap * m_subs; }; +/** + * Logger to send cluster log recieved by MON to journald + * + * @see JournaldLogger + */ +class JournaldClusterLogger { + public: + JournaldClusterLogger(); + ~JournaldClusterLogger(); + + /** + * @returns 0 if log entry is successfully sent, -1 otherwise. + */ + int log_log_entry(const LogEntry &le); + + private: + detail::JournaldClient client; + + std::unique_ptr m_log_entry_encoder; +}; } } diff --git a/src/common/options.cc b/src/common/options.cc index d86306e9b8c..53b9a9bfd74 100644 --- a/src/common/options.cc +++ b/src/common/options.cc @@ -793,6 +793,12 @@ std::vector