1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2025-01-11 05:17:44 +03:00

journal: support epxorting the journal in a format suitable for text/event-stream

This commit is contained in:
Lennart Poettering 2012-10-11 02:37:10 +02:00
parent 33316dbf20
commit 48383c2511
6 changed files with 23 additions and 5 deletions

View File

@ -193,6 +193,7 @@
<literal>export</literal>, <literal>export</literal>,
<literal>json</literal>, <literal>json</literal>,
<literal>json-pretty</literal>, <literal>json-pretty</literal>,
<literal>json-sse</literal>,
<literal>cat</literal>. <literal>short</literal> <literal>cat</literal>. <literal>short</literal>
is the default and generates an output is the default and generates an output
that is mostly identical to the that is mostly identical to the
@ -219,7 +220,12 @@
structures, but formats them in structures, but formats them in
multiple lines in order to make them multiple lines in order to make them
more readable for more readable for
humans. <literal>cat</literal> humans. <literal>json-sse</literal>
also formats entries as JSON data
structures, but wraps them in a format
suitable for <ulink
url="https://developer.mozilla.org/en-US/docs/Server-sent_events/Using_server-sent_events">Server-Sent
Events</ulink>. <literal>cat</literal>
generates a very terse output only generates a very terse output only
showing the actual message of each showing the actual message of each
journal entry with no meta data, not journal entry with no meta data, not

View File

@ -55,7 +55,8 @@ typedef struct RequestMeta {
static const char* const mime_types[_OUTPUT_MODE_MAX] = { static const char* const mime_types[_OUTPUT_MODE_MAX] = {
[OUTPUT_SHORT] = "text/plain", [OUTPUT_SHORT] = "text/plain",
[OUTPUT_JSON] = "application/json", [OUTPUT_JSON] = "application/json",
[OUTPUT_EXPORT] = "application/vnd.fdo.journal" [OUTPUT_JSON_SSE] = "text/event-stream",
[OUTPUT_EXPORT] = "application/vnd.fdo.journal",
}; };
static RequestMeta *request_meta(void **connection_cls) { static RequestMeta *request_meta(void **connection_cls) {
@ -286,6 +287,8 @@ static int request_parse_accept(
if (streq(accept, mime_types[OUTPUT_JSON])) if (streq(accept, mime_types[OUTPUT_JSON]))
m->mode = OUTPUT_JSON; m->mode = OUTPUT_JSON;
else if (streq(accept, mime_types[OUTPUT_JSON_SSE]))
m->mode = OUTPUT_JSON_SSE;
else if (streq(accept, mime_types[OUTPUT_EXPORT])) else if (streq(accept, mime_types[OUTPUT_EXPORT]))
m->mode = OUTPUT_EXPORT; m->mode = OUTPUT_EXPORT;
else else

View File

@ -93,7 +93,7 @@ static int help(void) {
" -n --lines[=INTEGER] Number of journal entries to show\n" " -n --lines[=INTEGER] Number of journal entries to show\n"
" --no-tail Show all lines, even in follow mode\n" " --no-tail Show all lines, even in follow mode\n"
" -o --output=STRING Change journal output mode (short, short-monotonic,\n" " -o --output=STRING Change journal output mode (short, short-monotonic,\n"
" verbose, export, json, json-pretty, cat)\n" " verbose, export, json, json-pretty, json-sse, cat)\n"
" -q --quiet Don't show privilege warning\n" " -q --quiet Don't show privilege warning\n"
" -m --merge Show entries from all available journals\n" " -m --merge Show entries from all available journals\n"
" -b --this-boot Show data only from current boot\n" " -b --this-boot Show data only from current boot\n"

View File

@ -502,7 +502,10 @@ static int output_json(
(unsigned long long) realtime, (unsigned long long) realtime,
(unsigned long long) monotonic, (unsigned long long) monotonic,
sd_id128_to_string(boot_id, sid)); sd_id128_to_string(boot_id, sid));
else else {
if (mode == OUTPUT_JSON_SSE)
fputs("data: ", f);
fprintf(f, fprintf(f,
"{ \"__CURSOR\" : \"%s\", " "{ \"__CURSOR\" : \"%s\", "
"\"__REALTIME_TIMESTAMP\" : \"%llu\", " "\"__REALTIME_TIMESTAMP\" : \"%llu\", "
@ -512,6 +515,7 @@ static int output_json(
(unsigned long long) realtime, (unsigned long long) realtime,
(unsigned long long) monotonic, (unsigned long long) monotonic,
sd_id128_to_string(boot_id, sid)); sd_id128_to_string(boot_id, sid));
}
free(cursor); free(cursor);
SD_JOURNAL_FOREACH_DATA(j, data, length) { SD_JOURNAL_FOREACH_DATA(j, data, length) {
@ -541,6 +545,8 @@ static int output_json(
if (mode == OUTPUT_JSON_PRETTY) if (mode == OUTPUT_JSON_PRETTY)
fputs("\n}\n", f); fputs("\n}\n", f);
else if (mode == OUTPUT_JSON_SSE)
fputs("}\n\n", f);
else else
fputs(" }\n", f); fputs(" }\n", f);
@ -592,6 +598,7 @@ static int (*output_funcs[_OUTPUT_MODE_MAX])(
[OUTPUT_EXPORT] = output_export, [OUTPUT_EXPORT] = output_export,
[OUTPUT_JSON] = output_json, [OUTPUT_JSON] = output_json,
[OUTPUT_JSON_PRETTY] = output_json, [OUTPUT_JSON_PRETTY] = output_json,
[OUTPUT_JSON_SSE] = output_json,
[OUTPUT_CAT] = output_cat [OUTPUT_CAT] = output_cat
}; };
@ -769,6 +776,7 @@ static const char *const output_mode_table[_OUTPUT_MODE_MAX] = {
[OUTPUT_EXPORT] = "export", [OUTPUT_EXPORT] = "export",
[OUTPUT_JSON] = "json", [OUTPUT_JSON] = "json",
[OUTPUT_JSON_PRETTY] = "json-pretty", [OUTPUT_JSON_PRETTY] = "json-pretty",
[OUTPUT_JSON_SSE] = "json-sse",
[OUTPUT_CAT] = "cat" [OUTPUT_CAT] = "cat"
}; };

View File

@ -34,6 +34,7 @@ typedef enum OutputMode {
OUTPUT_EXPORT, OUTPUT_EXPORT,
OUTPUT_JSON, OUTPUT_JSON,
OUTPUT_JSON_PRETTY, OUTPUT_JSON_PRETTY,
OUTPUT_JSON_SSE,
OUTPUT_CAT, OUTPUT_CAT,
_OUTPUT_MODE_MAX, _OUTPUT_MODE_MAX,
_OUTPUT_MODE_INVALID = -1 _OUTPUT_MODE_INVALID = -1

View File

@ -3939,7 +3939,7 @@ static int systemctl_help(void) {
" -n --lines=INTEGER Journal entries to show\n" " -n --lines=INTEGER Journal entries to show\n"
" --follow Follow journal\n" " --follow Follow journal\n"
" -o --output=STRING Change journal output mode (short, short-monotonic,\n" " -o --output=STRING Change journal output mode (short, short-monotonic,\n"
" verbose, export, json, json-pretty, cat)\n\n" " verbose, export, json, json-pretty, json-sse, cat)\n\n"
"Unit Commands:\n" "Unit Commands:\n"
" list-units List loaded units\n" " list-units List loaded units\n"
" start [NAME...] Start (activate) one or more units\n" " start [NAME...] Start (activate) one or more units\n"