Skip to content

Commit 4b49713

Browse files
committed
LogJsonEnvelope settings in config
1 parent fe26c70 commit 4b49713

File tree

3 files changed

+74
-18
lines changed

3 files changed

+74
-18
lines changed

ydb/core/audit/audit_log_impl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ void WriteLog(const TString& log, const TVector<THolder<TLogBackend>>& logBacken
7373
log.length()
7474
));
7575
} catch (const yexception& e) {
76-
LOG_W("WriteLog: unable to write audit log (error: " << e.what() << ")");
76+
LOG_E("WriteLog: unable to write audit log (error: " << e.what() << ")");
7777
}
7878
}
7979
}

ydb/core/log_backend/log_backend.cpp

Lines changed: 70 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,52 @@
11
#include "log_backend.h"
2+
#include "json_envelope.h"
23
#include "log_backend_build.h"
34
#include <ydb/core/base/counters.h>
45

6+
#include <util/system/mutex.h>
7+
58
namespace NKikimr {
69

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+
750
TAutoPtr<TLogBackend> CreateLogBackendWithUnifiedAgent(
851
const TKikimrRunConfig& runConfig,
952
NMonitoring::TDynamicCounterPtr counters)
@@ -127,36 +170,46 @@ TAutoPtr<TLogBackend> CreateAuditLogUnifiedAgentBackend(
127170
return logBackend;
128171
}
129172

173+
THolder<TLogBackend> MaybeWrapWithJsonEnvelope(THolder<TLogBackend> logBackend, const TString& jsonEnvelope) {
174+
if (jsonEnvelope.empty() || !logBackend) {
175+
return logBackend;
176+
}
177+
178+
return MakeHolder<TLogBackendWithJsonEnvelope>(jsonEnvelope, std::move(logBackend));
179+
}
180+
130181
TMap<NKikimrConfig::TAuditConfig::EFormat, TVector<THolder<TLogBackend>>> CreateAuditLogBackends(
131182
const TKikimrRunConfig& runConfig,
132183
NMonitoring::TDynamicCounterPtr counters) {
133184
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-
}
139185

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();
186+
if (runConfig.AppConfig.HasAuditConfig()) {
187+
const auto& auditConfig = runConfig.AppConfig.GetAuditConfig();
188+
if (auditConfig.HasStderrBackend()) {
189+
auto logBackend = MaybeWrapWithJsonEnvelope(NActors::CreateStderrBackend(), auditConfig.GetStderrBackend().GetLogJsonEnvelope());
190+
auto format = auditConfig.GetStderrBackend().GetFormat();
144191
logBackends[format].push_back(std::move(logBackend));
145192
}
146-
}
147193

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));
194+
if (auditConfig.HasFileBackend()) {
195+
auto logBackend = MaybeWrapWithJsonEnvelope(CreateAuditLogFileBackend(runConfig), auditConfig.GetFileBackend().GetLogJsonEnvelope());
196+
if (logBackend) {
197+
auto format = auditConfig.GetFileBackend().GetFormat();
198+
logBackends[format].push_back(std::move(logBackend));
199+
}
153200
}
154-
}
155201

202+
if (auditConfig.HasUnifiedAgentBackend()) {
203+
auto logBackend = MaybeWrapWithJsonEnvelope(CreateAuditLogUnifiedAgentBackend(runConfig, counters), auditConfig.GetUnifiedAgentBackend().GetLogJsonEnvelope());
204+
if (logBackend) {
205+
auto format = auditConfig.GetUnifiedAgentBackend().GetFormat();
206+
logBackends[format].push_back(std::move(logBackend));
207+
}
208+
}
209+
}
156210

157211
return logBackends;
158212
}
159213

160214

161215
} // NKikimr
162-

ydb/core/protos/config.proto

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1455,16 +1455,19 @@ message TAuditConfig {
14551455

14561456
message TStderrBackend {
14571457
optional EFormat Format = 1 [default = JSON];
1458+
optional string LogJsonEnvelope = 2; // Json template with text field containing %message% placeholder. For example {"my_enveloped_message": "%message%"}. %message% will be replaced with real audit log message
14581459
}
14591460

14601461
message TFileBackend {
14611462
optional EFormat Format = 1 [default = JSON];
14621463
optional string FilePath = 2;
1464+
optional string LogJsonEnvelope = 3; // Json template with text field containing %message% placeholder. For example {"my_enveloped_message": "%message%"}. %message% will be replaced with real audit log message
14631465
}
14641466

14651467
message TUnifiedAgentBackend {
14661468
optional EFormat Format = 1 [default = JSON];
14671469
optional string LogName = 2;
1470+
optional string LogJsonEnvelope = 3; // Json template with text field containing %message% placeholder. For example {"my_enveloped_message": "%message%"}. %message% will be replaced with real audit log message
14681471
}
14691472

14701473
optional TStderrBackend StderrBackend = 1;

0 commit comments

Comments
 (0)