chiark / gitweb /
journalctl: add --unit=/-u to match by unit name
[elogind.git] / src / journal / journalctl.c
index 34017484be49fb67a980c166da353a7f035b32b5..665b325a94937821b3ce3363edb0b137fdf8bc9b 100644 (file)
@@ -51,6 +51,7 @@
 #include "journal-authenticate.h"
 #include "journal-qrcode.h"
 #include "fsprg.h"
+#include "unit-name.h"
 
 #define DEFAULT_FSS_INTERVAL_USEC (15*USEC_PER_MINUTE)
 
@@ -72,6 +73,7 @@ static usec_t arg_interval = DEFAULT_FSS_INTERVAL_USEC;
 #endif
 static usec_t arg_since, arg_until;
 static bool arg_since_set = false, arg_until_set = false;
+static const char *arg_unit = NULL;
 
 static enum {
         ACTION_SHOW,
@@ -88,21 +90,22 @@ static int help(void) {
                "Send control commands to or query the journal.\n\n"
                "  -h --help              Show this help\n"
                "     --version           Show package version\n"
-               "     --no-pager          Do not pipe output into a pager\n"
-               "  -a --all               Show all fields, including long and unprintable\n"
                "  -c --cursor=CURSOR     Start showing entries from specified cursor\n"
                "     --since=DATE        Start showing entries newer or of the specified date\n"
                "     --until=DATE        Stop showing entries older or of the specified date\n"
+               "  -b --this-boot         Show data only from current boot\n"
+               "  -u --unit=UNIT         Show data only from the specified unit\n"
+               "  -p --priority=RANGE    Show only messages within the specified priority range\n\n"
                "  -f --follow            Follow journal\n"
                "  -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, json-sse, cat)\n"
+               "  -a --all               Show all fields, including long and unprintable\n"
                "  -q --quiet             Don't show privilege warning\n"
+               "     --no-pager          Do not pipe output into a pager\n"
                "  -m --merge             Show entries from all available journals\n"
-               "  -b --this-boot         Show data only from current boot\n"
                "  -D --directory=PATH    Show journal files from directory\n"
-               "  -p --priority=RANGE    Show only messages within the specified priority range\n\n"
                "Commands:\n"
                "     --new-id128         Generate a new 128 Bit ID\n"
                "     --header            Show journal header information\n"
@@ -159,6 +162,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "cursor",       required_argument, NULL, 'c'              },
                 { "since",        required_argument, NULL, ARG_SINCE        },
                 { "until",        required_argument, NULL, ARG_UNTIL        },
+                { "unit",         required_argument, NULL, 'u'              },
                 { NULL,           0,                 NULL, 0                }
         };
 
@@ -167,7 +171,7 @@ static int parse_argv(int argc, char *argv[]) {
         assert(argc >= 0);
         assert(argv);
 
-        while ((c = getopt_long(argc, argv, "hfo:an::qmbD:p:c:", options, NULL)) >= 0) {
+        while ((c = getopt_long(argc, argv, "hfo:an::qmbD:p:c:u:", options, NULL)) >= 0) {
 
                 switch (c) {
 
@@ -193,10 +197,17 @@ static int parse_argv(int argc, char *argv[]) {
                 case 'o':
                         arg_output = output_mode_from_string(optarg);
                         if (arg_output < 0) {
-                                log_error("Unknown output '%s'.", optarg);
+                                log_error("Unknown output format '%s'.", optarg);
                                 return -EINVAL;
                         }
 
+                        if (arg_output == OUTPUT_EXPORT ||
+                            arg_output == OUTPUT_JSON ||
+                            arg_output == OUTPUT_JSON_PRETTY ||
+                            arg_output == OUTPUT_JSON_SSE ||
+                            arg_output == OUTPUT_CAT)
+                                arg_quiet = true;
+
                         break;
 
                 case 'a':
@@ -350,6 +361,10 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_until_set = true;
                         break;
 
+                case 'u':
+                        arg_unit = optarg;
+                        break;
+
                 case '?':
                         return -EINVAL;
 
@@ -499,6 +514,32 @@ static int add_this_boot(sd_journal *j) {
         return 0;
 }
 
+static int add_unit(sd_journal *j) {
+        _cleanup_free_ char *m = NULL, *u = NULL;
+        int r;
+
+        assert(j);
+
+        if (isempty(arg_unit))
+                return 0;
+
+        u = unit_name_mangle(arg_unit);
+        if (!u)
+                return log_oom();
+
+        m = strappend("_SYSTEMD_UNIT=", u);
+        if (!m)
+                return log_oom();
+
+        r = sd_journal_add_match(j, m, strlen(m));
+        if (r < 0) {
+                log_error("Failed to add match: %s", strerror(-r));
+                return r;
+        }
+
+        return 0;
+}
+
 static int add_priorities(sd_journal *j) {
         char match[] = "PRIORITY=0";
         int i, r;
@@ -844,6 +885,10 @@ int main(int argc, char *argv[]) {
         if (r < 0)
                 goto finish;
 
+        r = add_unit(j);
+        if (r < 0)
+                goto finish;
+
         r = add_matches(j, argv + optind);
         if (r < 0)
                 goto finish;
@@ -908,9 +953,10 @@ int main(int argc, char *argv[]) {
 
                 if (r > 0) {
                         if (arg_follow)
-                                printf("---- Logs begin at %s.\n", format_timestamp(start_buf, sizeof(start_buf), start));
+                                printf("-- Logs begin at %s. --\n",
+                                       format_timestamp(start_buf, sizeof(start_buf), start));
                         else
-                                printf("---- Logs begin at %s, end at %s.\n",
+                                printf("-- Logs begin at %s, end at %s. --\n",
                                        format_timestamp(start_buf, sizeof(start_buf), start),
                                        format_timestamp(end_buf, sizeof(end_buf), end));
                 }
@@ -948,7 +994,7 @@ int main(int argc, char *argv[]) {
                                 if (r >= 0) {
                                         if (previous_boot_id_valid &&
                                             !sd_id128_equal(boot_id, previous_boot_id))
-                                                printf(ANSI_HIGHLIGHT_ON "---- Reboot ----" ANSI_HIGHLIGHT_OFF "\n");
+                                                printf(ANSI_HIGHLIGHT_ON "-- Reboot --" ANSI_HIGHLIGHT_OFF "\n");
 
                                         previous_boot_id = boot_id;
                                         previous_boot_id_valid = true;