Previously only one "--unit=" or "--user-unit" could be specified.
With this patch, journalcrtl can show multiple units.
$ journalctl -u systemd-udevd.service -u sshd.service -u crond.service -b
-- Logs begin at Sa 2013-03-23 11:08:45 CET, end at Fr 2013-04-12
09:10:22 CEST. --
Apr 12 08:41:37 lenovo systemd[1]: Started udev Kernel Device Manager.
Apr 12 08:41:37 lenovo systemd[1]: Stopped udev Kernel Device Manager.
Apr 12 08:41:38 lenovo systemd[1]: Started udev Kernel Device Manager.
Apr 12 08:41:38 lenovo crond[291]: (CRON) INFO (Syslog will be used
instead of sendmail.)
Apr 12 08:41:38 lenovo crond[291]: (CRON) INFO (running with inotify
support)
Apr 12 08:41:39 lenovo systemd[1]: Starting OpenSSH server daemon...
Apr 12 08:41:39 lenovo systemd[1]: Started OpenSSH server daemon.
Apr 12 08:41:39 lenovo sshd[355]: Server listening on 0.0.0.0 port 22.
Apr 12 08:41:39 lenovo sshd[355]: Server listening on :: port 22.
Apr 12 08:41:39 lenovo mtp-probe[373]: checking bus 1, device 8:
"/sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.5/1-1.5.6/1-1.5.6.2/1-1.5.6.2.1"
(<literal>_SYSTEMD_UNIT=</literal>)
and additional matches for messages
from systemd and messages about
(<literal>_SYSTEMD_UNIT=</literal>)
and additional matches for messages
from systemd and messages about
- coredumps for the specified unit.
+ coredumps for the specified unit.</para>
+ <para>This parameter can be specified multiple times.
</para></listitem>
</varlistentry>
</para></listitem>
</varlistentry>
and <literal>_UID=</literal>) and
additional matches for messages from
session systemd and messages about
and <literal>_UID=</literal>) and
additional matches for messages from
session systemd and messages about
- coredumps for the specified unit.
+ coredumps for the specified unit.</para>
+ <para>This parameter can be specified multiple times.
</para></listitem>
</varlistentry>
</para></listitem>
</varlistentry>
#endif
static usec_t arg_since, arg_until;
static bool arg_since_set = false, arg_until_set = false;
#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 bool arg_unit_system;
+static char **arg_system_units = NULL;
+static char **arg_user_units = NULL;
static const char *arg_field = NULL;
static bool arg_catalog = false;
static bool arg_reverse = false;
static const char *arg_field = NULL;
static bool arg_catalog = false;
static bool arg_reverse = false;
- arg_unit = optarg;
- arg_unit_system = true;
+ r = strv_extend(&arg_system_units, optarg);
+ if (r < 0)
+ return log_oom();
break;
case ARG_USER_UNIT:
break;
case ARG_USER_UNIT:
- arg_unit = optarg;
- arg_unit_system = false;
+ r = strv_extend(&arg_user_units, optarg);
+ if (r < 0)
+ return log_oom();
-static int add_unit(sd_journal *j) {
+static int add_units(sd_journal *j) {
_cleanup_free_ char *u = NULL;
int r;
_cleanup_free_ char *u = NULL;
int r;
- if (isempty(arg_unit))
- return 0;
+ STRV_FOREACH(i, arg_system_units) {
+ u = unit_name_mangle(*i);
+ if (!u)
+ return log_oom();
+ r = add_matches_for_unit(j, u);
+ if (r < 0)
+ return r;
+ r = sd_journal_add_disjunction(j);
+ if (r < 0)
+ return r;
+ }
- u = unit_name_mangle(arg_unit);
- if (!u)
- return log_oom();
+ STRV_FOREACH(i, arg_user_units) {
+ u = unit_name_mangle(*i);
+ if (!u)
+ return log_oom();
- if (arg_unit_system)
- r = add_matches_for_unit(j, u);
- else
r = add_matches_for_user_unit(j, u, getuid());
r = add_matches_for_user_unit(j, u, getuid());
+ if (r < 0)
+ return r;
+
+ r = sd_journal_add_disjunction(j);
+ if (r < 0)
+ return r;
+
+ }
r = sd_journal_add_conjunction(j);
if (r < 0)
r = sd_journal_add_conjunction(j);
if (r < 0)
if (r < 0)
return EXIT_FAILURE;
if (r < 0)
return EXIT_FAILURE;
+ r = add_units(j);
+ strv_free(arg_system_units);
+ strv_free(arg_user_units);
+
if (r < 0)
return EXIT_FAILURE;
if (r < 0)
return EXIT_FAILURE;