1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 * Ceph - scalable distributed file system
6 * Copyright (C) 2004-2006 Sage Weil <sage@newdream.net>
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License version 2.1, as published by the Free Software
11 * Foundation. See file COPYING.
15 #ifndef CEPH_LOGMONITOR_H
16 #define CEPH_LOGMONITOR_H
22 #include <fmt/format.h>
23 #include <fmt/ostream.h>
25 #include "include/types.h"
26 #include "PaxosService.h"
28 #include "common/config_fwd.h"
29 #include "common/LogEntry.h"
30 #include "include/str_map.h"
34 static const std::string LOG_META_CHANNEL
= "$channel";
39 class JournaldClusterLogger
;
43 class LogMonitor
: public PaxosService
,
44 public md_config_obs_t
{
46 std::multimap
<utime_t
,LogEntry
> pending_log
;
47 unordered_set
<LogEntryKey
> pending_keys
;
51 version_t external_log_to
= 0;
52 std::map
<std::string
, int> channel_fds
;
54 fmt::memory_buffer log_buffer
;
55 std::atomic
<bool> log_rotated
= false;
57 struct log_channel_info
{
59 std::map
<std::string
,std::string
> log_to_syslog
;
60 std::map
<std::string
,std::string
> syslog_level
;
61 std::map
<std::string
,std::string
> syslog_facility
;
62 std::map
<std::string
,std::string
> log_file
;
63 std::map
<std::string
,std::string
> expanded_log_file
;
64 std::map
<std::string
,std::string
> log_file_level
;
65 std::map
<std::string
,std::string
> log_to_graylog
;
66 std::map
<std::string
,std::string
> log_to_graylog_host
;
67 std::map
<std::string
,std::string
> log_to_graylog_port
;
68 std::map
<std::string
,std::string
> log_to_journald
;
70 std::map
<std::string
, std::shared_ptr
<ceph::logging::Graylog
>> graylogs
;
71 std::unique_ptr
<ceph::logging::JournaldClusterLogger
> journald
;
80 /** expands $channel meta variable on all maps *EXCEPT* log_file
82 * We won't expand the log_file map meta variables here because we
83 * intend to do that selectively during get_log_file()
85 void expand_channel_meta() {
86 expand_channel_meta(log_to_syslog
);
87 expand_channel_meta(syslog_level
);
88 expand_channel_meta(syslog_facility
);
89 expand_channel_meta(log_file_level
);
91 void expand_channel_meta(std::map
<std::string
,std::string
> &m
);
92 std::string
expand_channel_meta(const std::string
&input
,
93 const std::string
&change_to
);
95 bool do_log_to_syslog(const std::string
&channel
);
97 std::string
get_facility(const std::string
&channel
) {
98 return get_str_map_key(syslog_facility
, channel
,
99 &CLOG_CONFIG_DEFAULT_KEY
);
102 std::string
get_level(const std::string
&channel
) {
103 return get_str_map_key(syslog_level
, channel
,
104 &CLOG_CONFIG_DEFAULT_KEY
);
107 std::string
get_log_file(const std::string
&channel
);
109 std::string
get_log_file_level(const std::string
&channel
) {
110 return get_str_map_key(log_file_level
, channel
,
111 &CLOG_CONFIG_DEFAULT_KEY
);
114 bool do_log_to_graylog(const std::string
&channel
) {
115 return (get_str_map_key(log_to_graylog
, channel
,
116 &CLOG_CONFIG_DEFAULT_KEY
) == "true");
119 std::shared_ptr
<ceph::logging::Graylog
> get_graylog(const std::string
&channel
);
121 bool do_log_to_journald(const std::string
&channel
) {
122 return (get_str_map_key(log_to_journald
, channel
,
123 &CLOG_CONFIG_DEFAULT_KEY
) == "true");
126 ceph::logging::JournaldClusterLogger
&get_journald();
129 void update_log_channels();
131 void create_initial() override
;
132 void update_from_paxos(bool *need_bootstrap
) override
;
133 void create_pending() override
; // prepare a new pending
134 // propose pending update to peers
135 void generate_logentry_key(const std::string
& channel
, version_t v
, std::string
*out
);
136 void encode_pending(MonitorDBStore::TransactionRef t
) override
;
137 void encode_full(MonitorDBStore::TransactionRef t
) override
;
138 version_t
get_trim_to() const override
;
139 bool preprocess_query(MonOpRequestRef op
) override
; // true if processed.
140 bool prepare_update(MonOpRequestRef op
) override
;
142 bool preprocess_log(MonOpRequestRef op
);
143 bool prepare_log(MonOpRequestRef op
);
144 void _updated_log(MonOpRequestRef op
);
146 bool should_propose(double& delay
) override
;
148 bool should_stash_full() override
;
152 bool preprocess_command(MonOpRequestRef op
);
153 bool prepare_command(MonOpRequestRef op
);
155 void _create_sub_incremental(MLog
*mlog
, int level
, version_t sv
);
158 LogMonitor(Monitor
&mn
, Paxos
&p
, const std::string
& service_name
)
159 : PaxosService(mn
, p
, service_name
) { }
161 void init() override
{
162 generic_dout(10) << "LogMonitor::init" << dendl
;
163 g_conf().add_observer(this);
164 update_log_channels();
167 void tick() override
; // check state, take actions
169 void dump_info(Formatter
*f
);
171 void check_sub(Subscription
*s
);
174 this->log_rotated
.store(true);
176 void log_external_close_fds();
177 void log_external(const LogEntry
& le
);
178 void log_external_backlog();
181 * translate log sub name ('log-info') to integer id
184 * @return id, or -1 if unrecognized
186 int sub_name_to_id(const std::string
& n
);
188 void on_shutdown() override
{
189 g_conf().remove_observer(this);
192 const char **get_tracked_conf_keys() const override
{
193 static const char* KEYS
[] = {
194 "mon_cluster_log_to_syslog",
195 "mon_cluster_log_to_syslog_level",
196 "mon_cluster_log_to_syslog_facility",
197 "mon_cluster_log_file",
198 "mon_cluster_log_file_level",
199 "mon_cluster_log_to_graylog",
200 "mon_cluster_log_to_graylog_host",
201 "mon_cluster_log_to_graylog_port",
202 "mon_cluster_log_to_journald",
207 void handle_conf_change(const ConfigProxy
& conf
,
208 const std::set
<std::string
> &changed
) override
;