Skip to content

Commit 40b9e16

Browse files
committed
feat: json log format
Introduce a json log format that can be invoked by passing `log-format json` in your config. Signed-off-by: Johan Bergström <[email protected]>
1 parent 79d5047 commit 40b9e16

File tree

4 files changed

+9
-4
lines changed

4 files changed

+9
-4
lines changed

src/config.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ configEnum propagation_error_behavior_enum[] = {
153153
{"panic-on-replicas", PROPAGATION_ERR_BEHAVIOR_PANIC_ON_REPLICAS},
154154
{NULL, 0}};
155155

156-
configEnum log_format_enum[] = {{"legacy", LOG_FORMAT_LEGACY}, {"logfmt", LOG_FORMAT_LOGFMT}, {NULL, 0}};
156+
configEnum log_format_enum[] = {{"legacy", LOG_FORMAT_LEGACY}, {"logfmt", LOG_FORMAT_LOGFMT}, {"json", LOG_FORMAT_JSON}, {NULL, 0}};
157157

158158
configEnum log_timestamp_format_enum[] = {{"legacy", LOG_TIMESTAMP_LEGACY},
159159
{"iso8601", LOG_TIMESTAMP_ISO8601},

src/server.c

+5-2
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@ void serverLogRaw(int level, const char *msg) {
177177
const char *verbose_level[] = {"debug", "info", "notice", "warning"};
178178
const char *roles[] = {"sentinel", "RDB/AOF", "replica", "primary"};
179179
const char *role_chars = "XCSM";
180+
const char *json_format = "{\"pid\":%d,\"role\":\"%s\",\"timestamp\":\"%s\",\"level\":\"%s\",\"message\":\"%s\"}\n";
181+
const char *logfmt_format = "pid=%d role=%s timestamp=\"%s\" level=%s message=\"%s\"\n";
180182
FILE *fp;
181183
char buf[64];
182184
int rawmode = (level & LL_RAW);
@@ -229,13 +231,14 @@ void serverLogRaw(int level, const char *msg) {
229231
}
230232
switch (server.log_format) {
231233
case LOG_FORMAT_LOGFMT:
234+
case LOG_FORMAT_JSON:
232235
if (hasInvalidLogfmtChar(msg)) {
233236
char safemsg[LOG_MAX_LEN];
234237
filterInvalidLogfmtChar(safemsg, LOG_MAX_LEN, msg);
235-
fprintf(fp, "pid=%d role=%s timestamp=\"%s\" level=%s message=\"%s\"\n", (int)getpid(), roles[role_index],
238+
fprintf(fp, server.log_format == LOG_FORMAT_LOGFMT ? logfmt_format : json_format, (int)getpid(), roles[role_index],
236239
buf, verbose_level[level], safemsg);
237240
} else {
238-
fprintf(fp, "pid=%d role=%s timestamp=\"%s\" level=%s message=\"%s\"\n", (int)getpid(), roles[role_index],
241+
fprintf(fp, server.log_format == LOG_FORMAT_LOGFMT ? logfmt_format : json_format, (int)getpid(), roles[role_index],
239242
buf, verbose_level[level], msg);
240243
}
241244
break;

src/server.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,8 @@ typedef enum {
595595

596596
/* Sets log format */
597597
typedef enum { LOG_FORMAT_LEGACY = 0,
598-
LOG_FORMAT_LOGFMT } log_format_type;
598+
LOG_FORMAT_LOGFMT,
599+
LOG_FORMAT_JSON } log_format_type;
599600

600601
/* Sets log timestamp format */
601602
typedef enum { LOG_TIMESTAMP_LEGACY = 0,

valkey.conf

+1
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,7 @@ loglevel notice
401401
#
402402
# - legacy: the default, traditional log format
403403
# - logfmt: a structured log format; see https://www.brandur.org/logfmt
404+
# - json: a structured log format; see https://json.org/
404405
#
405406
# log-format legacy
406407

0 commit comments

Comments
 (0)