master
c 78 lines 2.38 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #include "nd_log-internals.h"
4
5 void nd_logger_json(BUFFER *wb, struct log_field *fields, size_t fields_max) {
6
7 // --- FIELD_PARSER_VERSIONS ---
8 //
9 // IMPORTANT:
10 // THERE ARE 6 VERSIONS OF THIS CODE
11 //
12 // 1. journal (direct socket API),
13 // 2. journal (libsystemd API),
14 // 3. logfmt,
15 // 4. json,
16 // 5. convert to uint64
17 // 6. convert to int64
18 //
19 // UPDATE ALL OF THEM FOR NEW FEATURES OR FIXES
20
21 buffer_json_initialize(wb, "\"", "\"", 0, true, BUFFER_JSON_OPTIONS_MINIFY);
22 CLEAN_BUFFER *tmp = NULL;
23
24 for (size_t i = 0; i < fields_max; i++) {
25 if (!fields[i].entry.set || !fields[i].logfmt)
26 continue;
27
28 const char *key = fields[i].logfmt;
29
30 const char *s = NULL;
31 switch(fields[i].entry.type) {
32 case NDFT_TXT:
33 s = fields[i].entry.txt;
34 break;
35 case NDFT_STR:
36 s = string2str(fields[i].entry.str);
37 break;
38 case NDFT_BFR:
39 s = buffer_tostring(fields[i].entry.bfr);
40 break;
41 case NDFT_U64:
42 buffer_json_member_add_uint64(wb, key, fields[i].entry.u64);
43 break;
44 case NDFT_I64:
45 buffer_json_member_add_int64(wb, key, fields[i].entry.i64);
46 break;
47 case NDFT_DBL:
48 buffer_json_member_add_double(wb, key, fields[i].entry.dbl);
49 break;
50 case NDFT_UUID:
51 if(!uuid_is_null(*fields[i].entry.uuid)) {
52 char u[UUID_COMPACT_STR_LEN];
53 uuid_unparse_lower_compact(*fields[i].entry.uuid, u);
54 buffer_json_member_add_string(wb, key, u);
55 }
56 break;
57 case NDFT_CALLBACK: {
58 if(!tmp)
59 tmp = buffer_create(1024, NULL);
60 else
61 buffer_flush(tmp);
62 if(fields[i].entry.cb.formatter(tmp, fields[i].entry.cb.formatter_data))
63 s = buffer_tostring(tmp);
64 else
65 s = NULL;
66 }
67 break;
68 default:
69 s = "UNHANDLED";
70 break;
71 }
72
73 if(s && *s)
74 buffer_json_member_add_string(wb, key, s);
75 }
76
77 buffer_json_finalize(wb);
78 }