]> git.proxmox.com Git - ceph.git/blob - ceph/src/mon/LogMonitor.h
import quincy beta 17.1.0
[ceph.git] / ceph / src / mon / LogMonitor.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3 /*
4 * Ceph - scalable distributed file system
5 *
6 * Copyright (C) 2004-2006 Sage Weil <sage@newdream.net>
7 *
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.
12 *
13 */
14
15 #ifndef CEPH_LOGMONITOR_H
16 #define CEPH_LOGMONITOR_H
17
18 #include <map>
19 #include <set>
20
21 #include <fmt/format.h>
22 #include <fmt/ostream.h>
23
24 #include "include/types.h"
25 #include "PaxosService.h"
26
27 #include "common/config_fwd.h"
28 #include "common/LogEntry.h"
29 #include "include/str_map.h"
30
31 class MLog;
32
33 static const std::string LOG_META_CHANNEL = "$channel";
34
35 namespace ceph {
36 namespace logging {
37 class Graylog;
38 class JournaldClusterLogger;
39 }
40 }
41
42 class LogMonitor : public PaxosService,
43 public md_config_obs_t {
44 private:
45 std::multimap<utime_t,LogEntry> pending_log;
46 unordered_set<LogEntryKey> pending_keys;
47
48 LogSummary summary;
49
50 version_t external_log_to = 0;
51 std::map<std::string, int> channel_fds;
52
53 fmt::memory_buffer file_log_buffer;
54
55 struct log_channel_info {
56
57 std::map<std::string,std::string> log_to_syslog;
58 std::map<std::string,std::string> syslog_level;
59 std::map<std::string,std::string> syslog_facility;
60 std::map<std::string,std::string> log_file;
61 std::map<std::string,std::string> expanded_log_file;
62 std::map<std::string,std::string> log_file_level;
63 std::map<std::string,std::string> log_to_graylog;
64 std::map<std::string,std::string> log_to_graylog_host;
65 std::map<std::string,std::string> log_to_graylog_port;
66 std::map<std::string,std::string> log_to_journald;
67
68 std::map<std::string, std::shared_ptr<ceph::logging::Graylog>> graylogs;
69 std::unique_ptr<ceph::logging::JournaldClusterLogger> journald;
70 uuid_d fsid;
71 std::string host;
72
73 log_channel_info();
74 ~log_channel_info();
75
76 void clear();
77
78 /** expands $channel meta variable on all maps *EXCEPT* log_file
79 *
80 * We won't expand the log_file map meta variables here because we
81 * intend to do that selectively during get_log_file()
82 */
83 void expand_channel_meta() {
84 expand_channel_meta(log_to_syslog);
85 expand_channel_meta(syslog_level);
86 expand_channel_meta(syslog_facility);
87 expand_channel_meta(log_file_level);
88 }
89 void expand_channel_meta(std::map<std::string,std::string> &m);
90 std::string expand_channel_meta(const std::string &input,
91 const std::string &change_to);
92
93 bool do_log_to_syslog(const std::string &channel);
94
95 std::string get_facility(const std::string &channel) {
96 return get_str_map_key(syslog_facility, channel,
97 &CLOG_CONFIG_DEFAULT_KEY);
98 }
99
100 std::string get_level(const std::string &channel) {
101 return get_str_map_key(syslog_level, channel,
102 &CLOG_CONFIG_DEFAULT_KEY);
103 }
104
105 std::string get_log_file(const std::string &channel);
106
107 std::string get_log_file_level(const std::string &channel) {
108 return get_str_map_key(log_file_level, channel,
109 &CLOG_CONFIG_DEFAULT_KEY);
110 }
111
112 bool do_log_to_graylog(const std::string &channel) {
113 return (get_str_map_key(log_to_graylog, channel,
114 &CLOG_CONFIG_DEFAULT_KEY) == "true");
115 }
116
117 std::shared_ptr<ceph::logging::Graylog> get_graylog(const std::string &channel);
118
119 bool do_log_to_journald(const std::string &channel) {
120 return (get_str_map_key(log_to_journald, channel,
121 &CLOG_CONFIG_DEFAULT_KEY) == "true");
122 }
123
124 ceph::logging::JournaldClusterLogger &get_journald();
125 } channels;
126
127 void update_log_channels();
128
129 void create_initial() override;
130 void update_from_paxos(bool *need_bootstrap) override;
131 void create_pending() override; // prepare a new pending
132 // propose pending update to peers
133 void generate_logentry_key(const std::string& channel, version_t v, std::string *out);
134 void encode_pending(MonitorDBStore::TransactionRef t) override;
135 void encode_full(MonitorDBStore::TransactionRef t) override;
136 version_t get_trim_to() const override;
137 bool preprocess_query(MonOpRequestRef op) override; // true if processed.
138 bool prepare_update(MonOpRequestRef op) override;
139
140 bool preprocess_log(MonOpRequestRef op);
141 bool prepare_log(MonOpRequestRef op);
142 void _updated_log(MonOpRequestRef op);
143
144 bool should_propose(double& delay) override;
145
146 bool should_stash_full() override;
147
148 struct C_Log;
149
150 bool preprocess_command(MonOpRequestRef op);
151 bool prepare_command(MonOpRequestRef op);
152
153 void _create_sub_incremental(MLog *mlog, int level, version_t sv);
154
155 public:
156 LogMonitor(Monitor &mn, Paxos &p, const std::string& service_name)
157 : PaxosService(mn, p, service_name) { }
158
159 void init() override {
160 generic_dout(10) << "LogMonitor::init" << dendl;
161 g_conf().add_observer(this);
162 update_log_channels();
163 }
164
165 void tick() override; // check state, take actions
166
167 void check_subs();
168 void check_sub(Subscription *s);
169
170 void log_external_close_fds();
171 void log_external(const LogEntry& le);
172 void log_external_backlog();
173
174 /**
175 * translate log sub name ('log-info') to integer id
176 *
177 * @param n name
178 * @return id, or -1 if unrecognized
179 */
180 int sub_name_to_id(const std::string& n);
181
182 void on_shutdown() override {
183 g_conf().remove_observer(this);
184 }
185
186 const char **get_tracked_conf_keys() const override {
187 static const char* KEYS[] = {
188 "mon_cluster_log_to_syslog",
189 "mon_cluster_log_to_syslog_level",
190 "mon_cluster_log_to_syslog_facility",
191 "mon_cluster_log_file",
192 "mon_cluster_log_file_level",
193 "mon_cluster_log_to_graylog",
194 "mon_cluster_log_to_graylog_host",
195 "mon_cluster_log_to_graylog_port",
196 "mon_cluster_log_to_journald",
197 NULL
198 };
199 return KEYS;
200 }
201 void handle_conf_change(const ConfigProxy& conf,
202 const std::set<std::string> &changed) override;
203 };
204 #endif