|
1 | 1 | #include "log_backend.h" |
| 2 | +#include "json_envelope.h" |
2 | 3 | #include "log_backend_build.h" |
3 | 4 | #include <ydb/core/base/counters.h> |
4 | 5 |
|
| 6 | +#include <util/system/mutex.h> |
| 7 | + |
5 | 8 | namespace NKikimr { |
6 | 9 |
|
| 10 | +class TLogBackendWithJsonEnvelope : public TLogBackend { |
| 11 | +public: |
| 12 | + TLogBackendWithJsonEnvelope(const TString& jsonEnvelope, THolder<TLogBackend> logBackend) |
| 13 | + : JsonEnvelope(jsonEnvelope) |
| 14 | + , LogBackend(std::move(logBackend)) |
| 15 | + {} |
| 16 | + |
| 17 | + void WriteData(const TLogRecord& rec) override { |
| 18 | + TString data; |
| 19 | + TLogRecord record = rec; |
| 20 | + with_lock (Mutex) { |
| 21 | + data = JsonEnvelope.ApplyJsonEnvelope(TStringBuf(record.Data, record.Len)); |
| 22 | + } |
| 23 | + record.Data = data.data(); |
| 24 | + record.Len = data.size(); |
| 25 | + LogBackend->WriteData(record); |
| 26 | + } |
| 27 | + |
| 28 | + void ReopenLog() override { |
| 29 | + LogBackend->ReopenLog(); |
| 30 | + } |
| 31 | + |
| 32 | + void ReopenLogNoFlush() override { |
| 33 | + LogBackend->ReopenLogNoFlush(); |
| 34 | + } |
| 35 | + |
| 36 | + ELogPriority FiltrationLevel() const override { |
| 37 | + return LogBackend->FiltrationLevel(); |
| 38 | + } |
| 39 | + |
| 40 | + size_t QueueSize() const override { |
| 41 | + return LogBackend->QueueSize(); |
| 42 | + } |
| 43 | + |
| 44 | +private: |
| 45 | + TJsonEnvelope JsonEnvelope; |
| 46 | + THolder<TLogBackend> LogBackend; |
| 47 | + TMutex Mutex; |
| 48 | +}; |
| 49 | + |
7 | 50 | TAutoPtr<TLogBackend> CreateLogBackendWithUnifiedAgent( |
8 | 51 | const TKikimrRunConfig& runConfig, |
9 | 52 | NMonitoring::TDynamicCounterPtr counters) |
@@ -127,36 +170,47 @@ TAutoPtr<TLogBackend> CreateAuditLogUnifiedAgentBackend( |
127 | 170 | return logBackend; |
128 | 171 | } |
129 | 172 |
|
| 173 | +THolder<TLogBackend> MaybeWrapWithJsonEnvelope(THolder<TLogBackend> logBackend, const TString& jsonEnvelope) { |
| 174 | + Y_ASSERT(logBackend); |
| 175 | + if (jsonEnvelope.empty()) { |
| 176 | + return logBackend; |
| 177 | + } |
| 178 | + |
| 179 | + return MakeHolder<TLogBackendWithJsonEnvelope>(jsonEnvelope, std::move(logBackend)); |
| 180 | +} |
| 181 | + |
130 | 182 | TMap<NKikimrConfig::TAuditConfig::EFormat, TVector<THolder<TLogBackend>>> CreateAuditLogBackends( |
131 | 183 | const TKikimrRunConfig& runConfig, |
132 | 184 | NMonitoring::TDynamicCounterPtr counters) { |
133 | 185 | TMap<NKikimrConfig::TAuditConfig::EFormat, TVector<THolder<TLogBackend>>> logBackends; |
134 | | - if (runConfig.AppConfig.HasAuditConfig() && runConfig.AppConfig.GetAuditConfig().HasStderrBackend()) { |
135 | | - auto logBackend = NActors::CreateStderrBackend(); |
136 | | - auto format = runConfig.AppConfig.GetAuditConfig().GetStderrBackend().GetFormat(); |
137 | | - logBackends[format].push_back(std::move(logBackend)); |
138 | | - } |
139 | 186 |
|
140 | | - if (runConfig.AppConfig.HasAuditConfig() && runConfig.AppConfig.GetAuditConfig().HasFileBackend()) { |
141 | | - auto logBackend = CreateAuditLogFileBackend(runConfig); |
142 | | - if (logBackend) { |
143 | | - auto format = runConfig.AppConfig.GetAuditConfig().GetFileBackend().GetFormat(); |
144 | | - logBackends[format].push_back(std::move(logBackend)); |
| 187 | + if (runConfig.AppConfig.HasAuditConfig()) { |
| 188 | + const auto& auditConfig = runConfig.AppConfig.GetAuditConfig(); |
| 189 | + if (auditConfig.HasStderrBackend()) { |
| 190 | + auto logBackend = NActors::CreateStderrBackend(); |
| 191 | + auto format = auditConfig.GetStderrBackend().GetFormat(); |
| 192 | + logBackends[format].push_back(MaybeWrapWithJsonEnvelope(std::move(logBackend), auditConfig.GetStderrBackend().GetLogJsonEnvelope())); |
145 | 193 | } |
146 | | - } |
147 | 194 |
|
148 | | - if (runConfig.AppConfig.HasAuditConfig() && runConfig.AppConfig.GetAuditConfig().HasUnifiedAgentBackend()) { |
149 | | - auto logBackend = CreateAuditLogUnifiedAgentBackend(runConfig, counters); |
150 | | - if (logBackend) { |
151 | | - auto format = runConfig.AppConfig.GetAuditConfig().GetUnifiedAgentBackend().GetFormat(); |
152 | | - logBackends[format].push_back(std::move(logBackend)); |
| 195 | + if (auditConfig.HasFileBackend()) { |
| 196 | + auto logBackend = CreateAuditLogFileBackend(runConfig); |
| 197 | + if (logBackend) { |
| 198 | + auto format = auditConfig.GetFileBackend().GetFormat(); |
| 199 | + logBackends[format].push_back(MaybeWrapWithJsonEnvelope(std::move(logBackend), auditConfig.GetFileBackend().GetLogJsonEnvelope())); |
| 200 | + } |
153 | 201 | } |
154 | | - } |
155 | 202 |
|
| 203 | + if (auditConfig.HasUnifiedAgentBackend()) { |
| 204 | + auto logBackend = CreateAuditLogUnifiedAgentBackend(runConfig, counters); |
| 205 | + if (logBackend) { |
| 206 | + auto format = auditConfig.GetUnifiedAgentBackend().GetFormat(); |
| 207 | + logBackends[format].push_back(MaybeWrapWithJsonEnvelope(std::move(logBackend), auditConfig.GetUnifiedAgentBackend().GetLogJsonEnvelope())); |
| 208 | + } |
| 209 | + } |
| 210 | + } |
156 | 211 |
|
157 | 212 | return logBackends; |
158 | 213 | } |
159 | 214 |
|
160 | 215 |
|
161 | 216 | } // NKikimr |
162 | | - |
|
0 commit comments