Commit c3f60ec5 authored by Lennart Poettering's avatar Lennart Poettering

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.
parent 78fbaaca
......@@ -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>
......@@ -312,38 +361,6 @@
paths.</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.</para></listitem>
</varlistentry>
<varlistentry>
<term><option>--new-id128</option></term>
......
......@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment