Zbigniew Jędrzejewski-Szmek 62fe94
From 730836403aee5f5bb998e6e3622ea7068fce0699 Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 62fe94
From: Harald Hoyer <harald@redhat.com>
Zbigniew Jędrzejewski-Szmek 62fe94
Date: Tue, 19 Aug 2014 11:27:34 +0200
Zbigniew Jędrzejewski-Szmek 62fe94
Subject: [PATCH] journalctl: add "-t --identifier=STRING" option
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
This turns journalctl to the counterpart of systemd-cat.
Zbigniew Jędrzejewski-Szmek 62fe94
Messages sent with
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
systemd-cat --identifier foo --prioritiy debug
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
can now be shown with
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
journalctl --identifier foo --prioritiy debug
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
"--identifier" is not merged with "--unit" to make a clear
Zbigniew Jędrzejewski-Szmek 62fe94
distinction between syslog and systemd units.
Zbigniew Jędrzejewski-Szmek 62fe94
syslog identifiers can be chosen freely by anyone.
Zbigniew Jędrzejewski-Szmek 62fe94
---
Zbigniew Jędrzejewski-Szmek 62fe94
 man/journalctl.xml       | 14 ++++++++++++++
Zbigniew Jędrzejewski-Szmek 62fe94
 src/journal/journalctl.c | 43 ++++++++++++++++++++++++++++++++++++++++++-
Zbigniew Jędrzejewski-Szmek 62fe94
 2 files changed, 56 insertions(+), 1 deletion(-)
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
diff --git a/man/journalctl.xml b/man/journalctl.xml
Zbigniew Jędrzejewski-Szmek 62fe94
index e10918a9c6..d4e031619a 100644
Zbigniew Jędrzejewski-Szmek 62fe94
--- a/man/journalctl.xml
Zbigniew Jędrzejewski-Szmek 62fe94
+++ b/man/journalctl.xml
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -498,6 +498,20 @@
Zbigniew Jędrzejewski-Szmek 62fe94
                         </varlistentry>
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
                         <varlistentry>
Zbigniew Jędrzejewski-Szmek 62fe94
+                                <term><option>-t</option></term>
Zbigniew Jędrzejewski-Szmek 62fe94
+                                <term><option>--identifier=<replaceable>SYSLOG_IDENTIFIER</replaceable>|<replaceable>PATTERN</replaceable></option></term>
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+                                <listitem><para>Show messages for the
Zbigniew Jędrzejewski-Szmek 62fe94
+                                specified syslog identifier
Zbigniew Jędrzejewski-Szmek 62fe94
+                                <replaceable>SYSLOG_IDENTIFIER</replaceable>, or
Zbigniew Jędrzejewski-Szmek 62fe94
+                                for any of the messages with a <literal>SYSLOG_IDENTIFIER</literal>
Zbigniew Jędrzejewski-Szmek 62fe94
+                                matched by <replaceable>PATTERN</replaceable>.</para>
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+                                <para>This parameter can be specified
Zbigniew Jędrzejewski-Szmek 62fe94
+                                multiple times.</para></listitem>
Zbigniew Jędrzejewski-Szmek 62fe94
+                        </varlistentry>
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+                        <varlistentry>
Zbigniew Jędrzejewski-Szmek 62fe94
                                 <term><option>-u</option></term>
Zbigniew Jędrzejewski-Szmek 62fe94
                                 <term><option>--unit=<replaceable>UNIT</replaceable>|<replaceable>PATTERN</replaceable></option></term>
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c
Zbigniew Jędrzejewski-Szmek 62fe94
index 5c4a71d618..f3680d1ce2 100644
Zbigniew Jędrzejewski-Szmek 62fe94
--- a/src/journal/journalctl.c
Zbigniew Jędrzejewski-Szmek 62fe94
+++ b/src/journal/journalctl.c
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -89,6 +89,7 @@ static bool arg_force = false;
Zbigniew Jędrzejewski-Szmek 62fe94
 #endif
Zbigniew Jędrzejewski-Szmek 62fe94
 static usec_t arg_since, arg_until;
Zbigniew Jędrzejewski-Szmek 62fe94
 static bool arg_since_set = false, arg_until_set = false;
Zbigniew Jędrzejewski-Szmek 62fe94
+static char **arg_syslog_identifier = NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
 static char **arg_system_units = NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
 static char **arg_user_units = NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
 static const char *arg_field = NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -180,6 +181,7 @@ static void help(void) {
Zbigniew Jędrzejewski-Szmek 62fe94
                "  -k --dmesg               Show kernel message log from the current boot\n"
Zbigniew Jędrzejewski-Szmek 62fe94
                "  -u --unit=UNIT           Show data only from the specified unit\n"
Zbigniew Jędrzejewski-Szmek 62fe94
                "     --user-unit=UNIT      Show data only from the specified user session unit\n"
Zbigniew Jędrzejewski-Szmek 62fe94
+               "  -t --identifier=STRING   Show only messages with the specified syslog identifier\n"
Zbigniew Jędrzejewski-Szmek 62fe94
                "  -p --priority=RANGE      Show only messages within the specified priority range\n"
Zbigniew Jędrzejewski-Szmek 62fe94
                "  -e --pager-end           Immediately jump to end of the journal in the pager\n"
Zbigniew Jędrzejewski-Szmek 62fe94
                "  -f --follow              Follow the journal\n"
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -276,6 +278,7 @@ static int parse_argv(int argc, char *argv[]) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 { "file",           required_argument, NULL, ARG_FILE           },
Zbigniew Jędrzejewski-Szmek 62fe94
                 { "root",           required_argument, NULL, ARG_ROOT           },
Zbigniew Jędrzejewski-Szmek 62fe94
                 { "header",         no_argument,       NULL, ARG_HEADER         },
Zbigniew Jędrzejewski-Szmek 62fe94
+                { "identifier",     required_argument, NULL, 't'                },
Zbigniew Jędrzejewski-Szmek 62fe94
                 { "priority",       required_argument, NULL, 'p'                },
Zbigniew Jędrzejewski-Szmek 62fe94
                 { "setup-keys",     no_argument,       NULL, ARG_SETUP_KEYS     },
Zbigniew Jędrzejewski-Szmek 62fe94
                 { "interval",       required_argument, NULL, ARG_INTERVAL       },
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -304,7 +307,7 @@ static int parse_argv(int argc, char *argv[]) {
Zbigniew Jędrzejewski-Szmek 62fe94
         assert(argc >= 0);
Zbigniew Jędrzejewski-Szmek 62fe94
         assert(argv);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-        while ((c = getopt_long(argc, argv, "hefo:aln::qmb::kD:p:c:u:F:xrM:", options, NULL)) >= 0)
Zbigniew Jędrzejewski-Szmek 62fe94
+        while ((c = getopt_long(argc, argv, "hefo:aln::qmb::kD:p:c:t:u:F:xrM:", options, NULL)) >= 0)
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
                 switch (c) {
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -590,6 +593,12 @@ static int parse_argv(int argc, char *argv[]) {
Zbigniew Jędrzejewski-Szmek 62fe94
                         arg_until_set = true;
Zbigniew Jędrzejewski-Szmek 62fe94
                         break;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
+                case 't':
Zbigniew Jędrzejewski-Szmek 62fe94
+                        r = strv_extend(&arg_syslog_identifier, optarg);
Zbigniew Jędrzejewski-Szmek 62fe94
+                        if (r < 0)
Zbigniew Jędrzejewski-Szmek 62fe94
+                                return log_oom();
Zbigniew Jędrzejewski-Szmek 62fe94
+                        break;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
                 case 'u':
Zbigniew Jędrzejewski-Szmek 62fe94
                         r = strv_extend(&arg_system_units, optarg);
Zbigniew Jędrzejewski-Szmek 62fe94
                         if (r < 0)
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -1212,6 +1221,32 @@ static int add_priorities(sd_journal *j) {
Zbigniew Jędrzejewski-Szmek 62fe94
         return 0;
Zbigniew Jędrzejewski-Szmek 62fe94
 }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+static int add_syslog_identifier(sd_journal *j) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        int r;
Zbigniew Jędrzejewski-Szmek 62fe94
+        char **i;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        assert(j);
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        STRV_FOREACH(i, arg_syslog_identifier) {
Zbigniew Jędrzejewski-Szmek 62fe94
+                char *u;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+                u = strappenda("SYSLOG_IDENTIFIER=", *i);
Zbigniew Jędrzejewski-Szmek 62fe94
+                r = sd_journal_add_match(j, u, 0);
Zbigniew Jędrzejewski-Szmek 62fe94
+                if (r < 0)
Zbigniew Jędrzejewski-Szmek 62fe94
+                        return r;
Zbigniew Jędrzejewski-Szmek 62fe94
+                r = sd_journal_add_disjunction(j);
Zbigniew Jędrzejewski-Szmek 62fe94
+                if (r < 0)
Zbigniew Jędrzejewski-Szmek 62fe94
+                        return r;
Zbigniew Jędrzejewski-Szmek 62fe94
+        }
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        r = sd_journal_add_conjunction(j);
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (r < 0)
Zbigniew Jędrzejewski-Szmek 62fe94
+                return r;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        return 0;
Zbigniew Jędrzejewski-Szmek 62fe94
+}
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
 static int setup_keys(void) {
Zbigniew Jędrzejewski-Szmek 62fe94
 #ifdef HAVE_GCRYPT
Zbigniew Jędrzejewski-Szmek 62fe94
         size_t mpk_size, seed_size, state_size, i;
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -1705,6 +1740,12 @@ int main(int argc, char *argv[]) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 return EXIT_FAILURE;
Zbigniew Jędrzejewski-Szmek 62fe94
         }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
+        r = add_syslog_identifier(j);
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (r < 0) {
Zbigniew Jędrzejewski-Szmek 62fe94
+                log_error("Failed to add filter for syslog identifiers: %s", strerror(-r));
Zbigniew Jędrzejewski-Szmek 62fe94
+                return EXIT_FAILURE;
Zbigniew Jędrzejewski-Szmek 62fe94
+        }
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
         r = add_priorities(j);
Zbigniew Jędrzejewski-Szmek 62fe94
         if (r < 0) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 log_error("Failed to add filter for priorities: %s", strerror(-r));