static bool arg_reverse = false;
static int arg_journal_type = 0;
static const char *arg_root = NULL;
+static const char *arg_machine = NULL;
static enum {
ACTION_SHOW,
uint64_t last;
} boot_id_t;
+static void pager_open_if_enabled(void) {
+
+ if (arg_no_pager)
+ return;
+
+ pager_open(arg_pager_end);
+}
+
static int help(void) {
+ pager_open_if_enabled();
+
printf("%s [OPTIONS...] [MATCHES...]\n\n"
"Query the journal.\n\n"
"Flags:\n"
" --system Show only the system journal\n"
- " --user Show only the user journal for current user\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"
- " -c --cursor=CURSOR Start showing entries from specified cursor\n"
- " --after-cursor=CURSOR Start showing entries from specified cursor\n"
+ " --user Show only the user journal for the current user\n"
+ " -M --machine=CONTAINER Operate on local container\n"
+ " --since=DATE Start showing entries on or newer than the specified date\n"
+ " --until=DATE Stop showing entries on or older than the specified date\n"
+ " -c --cursor=CURSOR Start showing entries from the specified cursor\n"
+ " --after-cursor=CURSOR Start showing entries from after the specified cursor\n"
" --show-cursor Print the cursor after all the entries\n"
- " -b --boot[=ID] Show data only from ID or current boot if unspecified\n"
+ " -b --boot[=ID] Show data only from ID or, if unspecified, the current boot\n"
" --list-boots Show terse information about recorded boots\n"
- " -k --dmesg Show kernel message log from current boot\n"
+ " -k --dmesg Show kernel message log from the current boot\n"
" -u --unit=UNIT Show data only from the specified unit\n"
" --user-unit=UNIT Show data only from the specified user session unit\n"
" -p --priority=RANGE Show only messages within the specified priority range\n"
" -e --pager-end Immediately jump to end of the journal in the pager\n"
- " -f --follow Follow journal\n"
+ " -f --follow Follow the journal\n"
" -n --lines[=INTEGER] Number of journal entries to show\n"
" --no-tail Show all lines, even in follow mode\n"
" -r --reverse Show the newest entries first\n"
" -o --output=STRING Change journal output mode (short, short-iso,\n"
- " short-precise, short-monotonic, verbose,\n"
- " export, json, json-pretty, json-sse, cat)\n"
+ " short-precise, short-monotonic, verbose,\n"
+ " export, json, json-pretty, json-sse, cat)\n"
" -x --catalog Add message explanations where available\n"
" --no-full Ellipsize fields\n"
" -a --all Show all fields, including long and unprintable\n"
- " -q --quiet Don't show privilege warning\n"
+ " -q --quiet Do not show privilege warning\n"
" --no-pager Do not pipe output into a pager\n"
" -m --merge Show entries from all available journals\n"
" -D --directory=PATH Show journal files from directory\n"
#ifdef HAVE_GCRYPT
" --interval=TIME Time interval for changing the FSS sealing key\n"
" --verify-key=KEY Specify FSS verification key\n"
- " --force Force overriding new FSS key pair with --setup-keys\n"
+ " --force Force overriding of the FSS key pair with --setup-keys\n"
#endif
"\nCommands:\n"
- " -h --help Show this help\n"
+ " -h --help Show this help text\n"
" --version Show package version\n"
- " --new-id128 Generate a new 128 Bit ID\n"
+ " --new-id128 Generate a new 128-bit ID\n"
" --header Show journal header information\n"
- " --disk-usage Show total disk usage\n"
- " -F --field=FIELD List all values a certain field takes\n"
+ " --disk-usage Show total disk usage of all journal files\n"
+ " -F --field=FIELD List all values that a specified field takes\n"
" --list-catalog Show message IDs of all entries in the message catalog\n"
" --dump-catalog Show entries in the message catalog\n"
" --update-catalog Update the message catalog database\n"
#ifdef HAVE_GCRYPT
- " --setup-keys Generate new FSS key pair\n"
+ " --setup-keys Generate a new FSS key pair\n"
" --verify Verify journal file consistency\n"
#endif
, program_invocation_short_name);
{ "dump-catalog", no_argument, NULL, ARG_DUMP_CATALOG },
{ "update-catalog", no_argument, NULL, ARG_UPDATE_CATALOG },
{ "reverse", no_argument, NULL, 'r' },
+ { "machine", required_argument, NULL, 'M' },
{}
};
assert(argc >= 0);
assert(argv);
- while ((c = getopt_long(argc, argv, "hefo:aln::qmb::kD:p:c:u:F:xr", options, NULL)) >= 0) {
+ while ((c = getopt_long(argc, argv, "hefo:aln::qmb::kD:p:c:u:F:xrM:", options, NULL)) >= 0) {
switch (c) {
arg_journal_type |= SD_JOURNAL_CURRENT_USER;
break;
+ case 'M':
+ arg_machine = optarg;
+ break;
+
case 'D':
arg_directory = optarg;
break;
if (arg_follow && !arg_no_tail && arg_lines < 0)
arg_lines = 10;
- if (arg_directory && arg_file) {
- log_error("Please specify either -D/--directory= or --file=, not both.");
+ if (!!arg_directory + !!arg_file + !!arg_machine > 1) {
+ log_error("Please specify either -D/--directory= or --file= or -M/--machine=, not more than one.");
return -EINVAL;
}
return 0;
if (!arg_boot_descriptor)
- return add_match_this_boot(j);
+ return add_match_this_boot(j, arg_machine);
if (strlen(arg_boot_descriptor) >= 32) {
char tmp = arg_boot_descriptor[32];
r = sd_journal_open_directory(&j, arg_directory, arg_journal_type);
else if (arg_file)
r = sd_journal_open_files(&j, (const char**) arg_file, 0);
+ else if (arg_machine)
+ r = sd_journal_open_container(&j, arg_machine, 0);
else
r = sd_journal_open(&j, !arg_merge*SD_JOURNAL_LOCAL_ONLY + arg_journal_type);
if (r < 0) {
return EXIT_FAILURE;
}
- if (!arg_no_pager && !arg_follow)
- pager_open(arg_pager_end);
+ if (!arg_follow)
+ pager_open_if_enabled();
if (!arg_quiet) {
usec_t start, end;