summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2012-10-16 02:59:27 +0200
committerLennart Poettering <lennart@poettering.net>2012-10-16 02:59:27 +0200
commitc3f60ec54da2a5d1ba00cec6bb2c282f079aa3f6 (patch)
treef2fd271d9bb33731dce450b9c97a5a076120daed
parent78fbaacac004f912ec84b6f57d0bc656c3c95439 (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.xml83
-rw-r--r--src/journal/journalctl.c48
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;