chiark / gitweb /
journal: support epxorting the journal in a format suitable for text/event-stream
authorLennart Poettering <lennart@poettering.net>
Thu, 11 Oct 2012 00:37:10 +0000 (02:37 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 11 Oct 2012 00:37:10 +0000 (02:37 +0200)
man/journalctl.xml
src/journal/journal-gatewayd.c
src/journal/journalctl.c
src/shared/logs-show.c
src/shared/logs-show.h
src/systemctl/systemctl.c

index 651a8a5..62373d8 100644 (file)
                                 <literal>export</literal>,
                                 <literal>json</literal>,
                                 <literal>json-pretty</literal>,
+                                <literal>json-sse</literal>,
                                 <literal>cat</literal>. <literal>short</literal>
                                 is the default and generates an output
                                 that is mostly identical to the
                                 structures, but formats them in
                                 multiple lines in order to make them
                                 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
                                 showing the actual message of each
                                 journal entry with no meta data, not
index 33dda26..b2d4abf 100644 (file)
@@ -55,7 +55,8 @@ typedef struct RequestMeta {
 static const char* const mime_types[_OUTPUT_MODE_MAX] = {
         [OUTPUT_SHORT] = "text/plain",
         [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) {
@@ -286,6 +287,8 @@ static int request_parse_accept(
 
         if (streq(accept, mime_types[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]))
                 m->mode = OUTPUT_EXPORT;
         else
index ec05c16..04cebff 100644 (file)
@@ -93,7 +93,7 @@ static int help(void) {
                "  -n --lines[=INTEGER]   Number of journal entries to show\n"
                "     --no-tail           Show all lines, even in follow mode\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"
                "  -m --merge             Show entries from all available journals\n"
                "  -b --this-boot         Show data only from current boot\n"
index 725adb6..28d12d3 100644 (file)
@@ -502,7 +502,10 @@ static int output_json(
                         (unsigned long long) realtime,
                         (unsigned long long) monotonic,
                         sd_id128_to_string(boot_id, sid));
-        else
+        else {
+                if (mode == OUTPUT_JSON_SSE)
+                        fputs("data: ", f);
+
                 fprintf(f,
                         "{ \"__CURSOR\" : \"%s\", "
                         "\"__REALTIME_TIMESTAMP\" : \"%llu\", "
@@ -512,6 +515,7 @@ static int output_json(
                         (unsigned long long) realtime,
                         (unsigned long long) monotonic,
                         sd_id128_to_string(boot_id, sid));
+        }
         free(cursor);
 
         SD_JOURNAL_FOREACH_DATA(j, data, length) {
@@ -541,6 +545,8 @@ static int output_json(
 
         if (mode == OUTPUT_JSON_PRETTY)
                 fputs("\n}\n", f);
+        else if (mode == OUTPUT_JSON_SSE)
+                fputs("}\n\n", f);
         else
                 fputs(" }\n", f);
 
@@ -592,6 +598,7 @@ static int (*output_funcs[_OUTPUT_MODE_MAX])(
         [OUTPUT_EXPORT] = output_export,
         [OUTPUT_JSON] = output_json,
         [OUTPUT_JSON_PRETTY] = output_json,
+        [OUTPUT_JSON_SSE] = output_json,
         [OUTPUT_CAT] = output_cat
 };
 
@@ -769,6 +776,7 @@ static const char *const output_mode_table[_OUTPUT_MODE_MAX] = {
         [OUTPUT_EXPORT] = "export",
         [OUTPUT_JSON] = "json",
         [OUTPUT_JSON_PRETTY] = "json-pretty",
+        [OUTPUT_JSON_SSE] = "json-sse",
         [OUTPUT_CAT] = "cat"
 };
 
index ea0f51f..1b67876 100644 (file)
@@ -34,6 +34,7 @@ typedef enum OutputMode {
         OUTPUT_EXPORT,
         OUTPUT_JSON,
         OUTPUT_JSON_PRETTY,
+        OUTPUT_JSON_SSE,
         OUTPUT_CAT,
         _OUTPUT_MODE_MAX,
         _OUTPUT_MODE_INVALID = -1
index a4290c4..d1fbb78 100644 (file)
@@ -3939,7 +3939,7 @@ static int systemctl_help(void) {
                "  -n --lines=INTEGER  Journal entries to show\n"
                "     --follow         Follow journal\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"
                "  list-units                      List loaded units\n"
                "  start [NAME...]                 Start (activate) one or more units\n"