diff options
author | Lennart Poettering <lennart@poettering.net> | 2012-10-16 02:59:27 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2012-10-16 02:59:27 +0200 |
commit | c3f60ec54da2a5d1ba00cec6bb2c282f079aa3f6 (patch) | |
tree | f2fd271d9bb33731dce450b9c97a5a076120daed | |
parent | 78fbaacac004f912ec84b6f57d0bc656c3c95439 (diff) |
journalctl: add --unit=/-u to match by unit name
This applies unit_name_mangle() to the specified unit names and hence
can handle weird characters nicely and will add unit suffixes as
necessary.
-rw-r--r-- | man/journalctl.xml | 83 | ||||
-rw-r--r-- | src/journal/journalctl.c | 48 |
2 files changed, 93 insertions, 38 deletions
diff --git a/man/journalctl.xml b/man/journalctl.xml index 0bbcee33ab..a533f4d0ea 100644 --- a/man/journalctl.xml +++ b/man/journalctl.xml @@ -257,7 +257,56 @@ <term><option>-b</option></term> <listitem><para>Show data only from - current boot.</para></listitem> + current boot. This will add a match + for <literal>_BOOT_ID=</literal> for + the current boot ID of the + kernel.</para></listitem> + </varlistentry> + + <varlistentry> + <term><option>--unit=</option></term> + <term><option>-u</option></term> + + <listitem><para>Show data only of the + specified unit. This will add a match + for <literal>_SYSTEMD_UNIT=</literal> + for the specified + unit.</para></listitem> + </varlistentry> + + <varlistentry> + <term><option>-p</option></term> + <term><option>--priority=</option></term> + + <listitem><para>Filter output by + message priorities or priority + ranges. Takes either a single numeric + or textual log level (i.e. between + 0/<literal>emerg</literal> and + 7/<literal>debug</literal>), or a + range of numeric/text log levels in + the form FROM..TO. The log levels are + the usual syslog log levels as + documented in + <citerefentry><refentrytitle>syslog</refentrytitle><manvolnum>3</manvolnum></citerefentry>, + i.e. <literal>emerg</literal> (0), + <literal>alert</literal> (1), + <literal>crit</literal> (2), + <literal>err</literal> (3), + <literal>warning</literal> (4), + <literal>notice</literal> (5), + <literal>info</literal> (6), + <literal>debug</literal> (7). If a + single log level is specified all + messages with this log level or a + lower (hence more important) log level + are shown. If a range is specified all + messages within the range are shown, + including both the start and the end + value of the range. This will add + <literal>PRIORITY=</literal> matches + for the specified + priorities.</para></listitem> </varlistentry> <varlistentry> @@ -313,38 +362,6 @@ </varlistentry> <varlistentry> - <term><option>-p</option></term> - <term><option>--priority=</option></term> - - <listitem><para>Filter output by - message priorities or priority - ranges. Takes either a single numeric - or textual log level (i.e. between - 0/<literal>emerg</literal> and - 7/<literal>debug</literal>), or a - range of numeric/text log levels in - the form FROM..TO. The log levels are - the usual syslog log levels as - documented in - <citerefentry><refentrytitle>syslog</refentrytitle><manvolnum>3</manvolnum></citerefentry>, - i.e. <literal>emerg</literal> (0), - <literal>alert</literal> (1), - <literal>crit</literal> (2), - <literal>err</literal> (3), - <literal>warning</literal> (4), - <literal>notice</literal> (5), - <literal>info</literal> (6), - <literal>debug</literal> (7). If a - single log level is specified all - messages with this log level or a - lower (hence more important) log level - are shown. If a range is specified all - messages within the range are shown, - including both the start and the end - value of the range.</para></listitem> - </varlistentry> - - <varlistentry> <term><option>--new-id128</option></term> <listitem><para>Instead of showing diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 0498f294ae..665b325a94 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -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) { @@ -357,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; @@ -506,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; @@ -851,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; |