diff options
author | Lennart Poettering <lennart@poettering.net> | 2012-08-09 17:05:29 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2012-08-09 17:05:29 +0200 |
commit | b6a345143bf6ffdc87a7149015f75c03be440b10 (patch) | |
tree | 01678dafc89ae8d68fe61f86822b23af6689639a | |
parent | 5b4c61cd0b7d35f5a905c83a0ee111a1876a7873 (diff) |
journalctl: support device node matches as shortcut
-rw-r--r-- | man/journalctl.xml | 17 | ||||
-rw-r--r-- | src/journal/journalctl.c | 27 |
2 files changed, 31 insertions, 13 deletions
diff --git a/man/journalctl.xml b/man/journalctl.xml index cd17ca6ae7..3cfda5b84b 100644 --- a/man/journalctl.xml +++ b/man/journalctl.xml @@ -86,6 +86,15 @@ command line all matches before and after are combined in a disjunction (i.e. logical OR).</para> + <para>As shortcuts for a few types of field/value + matches file paths may be specified. If a file path + refers to an executable file, this is equivalent to an + <literal>_EXE=</literal> match for the canonicalized + binary path. Similar, if a path refers to a device + node, this is equivalent to a + <literal>_KERNEL_DEVICE=</literal> match for the + device.</para> + <para>Output is interleaved from all accessible journal files, whether they are rotated or currently being written, and regardless whether they belong to the @@ -357,6 +366,14 @@ <programlisting>journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=28097 + _SYSTEMD_UNIT=dbus.service</programlisting> + <para>Show all logs generated by the D-Bus executable:</para> + + <programlisting>journalctl /usr/bin/dbus-daemon</programlisting> + + <para>Show all logs of the kernel device node <filename>/dev/sda</filename>:</para> + + <programlisting>journalctl /dev/sda</programlisting> + </refsect1> <refsect1> diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 10959423f6..62bb904dbe 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -305,7 +305,7 @@ static int add_matches(sd_journal *j, char **args) { if (streq(*i, "+")) r = sd_journal_add_disjunction(j); else if (path_is_absolute(*i)) { - char *p; + char *p, *t = NULL; const char *path; struct stat st; @@ -318,24 +318,25 @@ static int add_matches(sd_journal *j, char **args) { return -errno; } - if (S_ISREG(st.st_mode) && (0111 & st.st_mode)) { - char *t; - + if (S_ISREG(st.st_mode) && (0111 & st.st_mode)) t = strappend("_EXE=", path); - if (!t) { - free(p); - return log_oom(); - } - - r = sd_journal_add_match(j, t, 0); - free(t); - } else { + else if (S_ISCHR(st.st_mode)) + asprintf(&t, "_KERNEL_DEVICE=c%u:%u", major(st.st_rdev), minor(st.st_rdev)); + else if (S_ISBLK(st.st_mode)) + asprintf(&t, "_KERNEL_DEVICE=b%u:%u", major(st.st_rdev), minor(st.st_rdev)); + else { free(p); - log_error("File is not a regular file or is not executable: %s", *i); + log_error("File is not a device node, regular file or is not executable: %s", *i); return -EINVAL; } free(p); + + if (!t) + return log_oom(); + + r = sd_journal_add_match(j, t, 0); + free(t); } else r = sd_journal_add_match(j, *i, 0); |