diff options
author | Lennart Poettering <lennart@poettering.net> | 2012-08-22 02:49:17 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2012-08-22 02:49:17 +0200 |
commit | bdfb9e7f7c315af5a6755ac4701b696ce2305a19 (patch) | |
tree | e2fa5e93af19e7a09e5311f0aecfe6ff1e59296f | |
parent | c0d6e764d107a81a6439c41edbe92790623ed7de (diff) |
journald: augment journal entries from the kernel with data from udev
-rw-r--r-- | Makefile.am | 3 | ||||
-rw-r--r-- | man/sd_journal_print.xml | 20 | ||||
-rw-r--r-- | man/systemd.journal-fields.xml | 30 | ||||
-rw-r--r-- | src/journal/journald.c | 63 | ||||
-rw-r--r-- | src/journal/journald.h | 2 |
5 files changed, 106 insertions, 12 deletions
diff --git a/Makefile.am b/Makefile.am index e6bfc1f39e..22445fbde4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2322,7 +2322,8 @@ systemd_journald_LDADD = \ libsystemd-audit.la \ libsystemd-daemon.la \ libsystemd-id128-internal.la \ - libsystemd-journal-internal.la + libsystemd-journal-internal.la \ + libudev.la if ENABLE_LOGIND systemd_journald_LDADD += \ diff --git a/man/sd_journal_print.xml b/man/sd_journal_print.xml index 7eac6c8192..c03762ac2c 100644 --- a/man/sd_journal_print.xml +++ b/man/sd_journal_print.xml @@ -131,17 +131,19 @@ immediately followed by their associated parameters, terminated by NULL. The strings passed should be of the format <literal>VARIABLE=value</literal>. The - variable name must be in uppercase and consist only - of characters, numbers and underscores, and may not - begin with an underscore. The value can be of any size - and format. It is highly recommended to submit - text strings formatted in the UTF-8 character encoding - only, and submit binary fields only when formatting in - UTf-8 strings is not sensible. A number of well known - fields are defined, see + variable name must be in uppercase and consist only of + characters, numbers and underscores, and may not begin + with an underscore. (All assignments that do not + follow this syntax will be ignored.) The value can be + of any size and format. It is highly recommended to + submit text strings formatted in the UTF-8 character + encoding only, and submit binary fields only when + formatting in UTf-8 strings is not sensible. A number + of well known fields are defined, see <citerefentry><refentrytitle>systemd.journal-fields</refentrytitle><manvolnum>7</manvolnum></citerefentry> for details, but additional application defined fields - may be used.</para> + may be used. A variable may be assigned more than one + value per entry.</para> <para><function>sd_journal_sendv()</function> is similar to <function>sd_journal_send()</function> but diff --git a/man/systemd.journal-fields.xml b/man/systemd.journal-fields.xml index d790c35a03..b555c0e0ac 100644 --- a/man/systemd.journal-fields.xml +++ b/man/systemd.journal-fields.xml @@ -58,7 +58,8 @@ sense. New fields may freely be defined by applications, but a few fields have special meaning. All fields with special meanings are - optional.</para> + optional. In some cases fields may appear more than + once per entry.</para> </refsect1> <refsect1> @@ -338,6 +339,33 @@ <para>The kernel subsystem name.</para> </listitem> </varlistentry> + <varlistentry> + <term>_UDEV_SYSNAME=</term> + <listitem> + <para>The kernel device name + as it shows up in the device + tree below + <filename>/sys</filename>.</para> + </listitem> + </varlistentry> + <varlistentry> + <term>_UDEV_DEVNODE=</term> + <listitem> + <para>The device node path of + this device in + <filename>/dev</filename>.</para> + </listitem> + </varlistentry> + <varlistentry> + <term>_UDEV_DEVLINK=</term> + <listitem> + <para>Additional symlink names + pointing to the device node in + <filename>/dev</filename>. This + field is frequently set more + than once per entry.</para> + </listitem> + </varlistentry> </variablelist> </refsect1> diff --git a/src/journal/journald.c b/src/journal/journald.c index a5025f5687..2429dd3e27 100644 --- a/src/journal/journald.c +++ b/src/journal/journald.c @@ -31,6 +31,7 @@ #include <sys/statvfs.h> #include <sys/mman.h> +#include <libudev.h> #include <systemd/sd-journal.h> #include <systemd/sd-messages.h> #include <systemd/sd-daemon.h> @@ -74,6 +75,7 @@ #define N_IOVEC_META_FIELDS 17 #define N_IOVEC_KERNEL_FIELDS 64 +#define N_IOVEC_UDEV_FIELDS 32 #define ENTRY_SIZE_MAX (1024*1024*32) @@ -1811,7 +1813,7 @@ static bool is_us(const char *pid) { } static void dev_kmsg_record(Server *s, char *p, size_t l) { - struct iovec iovec[N_IOVEC_META_FIELDS + 7 + N_IOVEC_KERNEL_FIELDS]; + struct iovec iovec[N_IOVEC_META_FIELDS + 7 + N_IOVEC_KERNEL_FIELDS + 2 + N_IOVEC_UDEV_FIELDS]; char *message = NULL, *syslog_priority = NULL, *syslog_pid = NULL, *syslog_facility = NULL, *syslog_identifier = NULL, *source_time = NULL; int priority, r; unsigned n = 0, z = 0, j; @@ -1819,6 +1821,7 @@ static void dev_kmsg_record(Server *s, char *p, size_t l) { char *identifier = NULL, *pid = NULL, *e, *f, *k; uint64_t serial; size_t pl; + char *kernel_device = NULL; assert(s); assert(p); @@ -1910,6 +1913,9 @@ static void dev_kmsg_record(Server *s, char *p, size_t l) { if (!m) break; + if (startswith(m, "_KERNEL_DEVICE=")) + kernel_device = m + 15; + IOVEC_SET_STRING(iovec[n++], m); z++; @@ -1917,6 +1923,54 @@ static void dev_kmsg_record(Server *s, char *p, size_t l) { k = e + 1; } + if (kernel_device) { + struct udev_device *ud; + + ud = udev_device_new_from_device_id(s->udev, kernel_device); + if (ud) { + const char *g; + struct udev_list_entry *ll; + char *b; + + g = udev_device_get_devnode(ud); + if (g) { + b = strappend("_UDEV_DEVNODE=", g); + if (b) { + IOVEC_SET_STRING(iovec[n++], b); + z++; + } + } + + g = udev_device_get_sysname(ud); + if (g) { + b = strappend("_UDEV_SYSNAME=", g); + if (b) { + IOVEC_SET_STRING(iovec[n++], b); + z++; + } + } + + j = 0; + ll = udev_device_get_devlinks_list_entry(ud); + udev_list_entry_foreach(ll, ll) { + + if (j > N_IOVEC_UDEV_FIELDS) + break; + + g = udev_list_entry_get_name(ll); + b = strappend("_UDEV_DEVLINK=", g); + if (g) { + IOVEC_SET_STRING(iovec[n++], b); + z++; + } + + j++; + } + + udev_device_unref(ud); + } + } + if (asprintf(&source_time, "_SOURCE_MONOTONIC_TIMESTAMP=%llu", (unsigned long long) usec) >= 0) IOVEC_SET_STRING(iovec[n++], source_time); @@ -2871,6 +2925,10 @@ static int server_init(Server *s) { if (r < 0) return r; + s->udev = udev_new(); + if (!s->udev) + return -ENOMEM; + s->rate_limit = journal_rate_limit_new(s->rate_limit_interval, s->rate_limit_burst); if (!s->rate_limit) return -ENOMEM; @@ -2929,6 +2987,9 @@ static void server_done(Server *s) { if (s->mmap) mmap_cache_unref(s->mmap); + + if (s->udev) + udev_unref(s->udev); } int main(int argc, char *argv[]) { diff --git a/src/journal/journald.h b/src/journal/journald.h index 13f2f1f5d1..da2c312474 100644 --- a/src/journal/journald.h +++ b/src/journal/journald.h @@ -99,6 +99,8 @@ typedef struct Server { bool dev_kmsg_readable; uint64_t *kernel_seqnum; + + struct udev *udev; } Server; /* gperf lookup function */ |