summaryrefslogtreecommitdiff
path: root/src/journal/journalctl.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2012-11-15 23:03:31 +0100
committerLennart Poettering <lennart@poettering.net>2012-11-15 23:09:07 +0100
commitd4205751d4643c272059a3728045929dd0e5e800 (patch)
treec9931806e99d42789fc5ce3fc03e17285b9bb208 /src/journal/journalctl.c
parent59f432ea6d6d441d0af7c76c37e80730c8df473a (diff)
journal: implement message catalog
The message catalog can be used to attach short help texts to log lines, keyed by their MESSAGE_ID= fields. This is useful to help the administrator understand the context and cause of a message, find possible solutions and find further related documentation. Since this is keyed off MESSAGE_ID= this will only work for native journal messages. The message catalog supports i18n, and is useful to augment english language system messages with explanations in the local language. This commit only includes short explanatory messages for a few example message IDs, we'll add more complete documentation for the relevant systemd messages later on.
Diffstat (limited to 'src/journal/journalctl.c')
-rw-r--r--src/journal/journalctl.c41
1 files changed, 38 insertions, 3 deletions
diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c
index 011a11b70b..46a7be20ce 100644
--- a/src/journal/journalctl.c
+++ b/src/journal/journalctl.c
@@ -51,6 +51,7 @@
#include "journal-qrcode.h"
#include "fsprg.h"
#include "unit-name.h"
+#include "catalog.h"
#define DEFAULT_FSS_INTERVAL_USEC (15*USEC_PER_MINUTE)
@@ -74,6 +75,7 @@ static usec_t arg_since, arg_until;
static bool arg_since_set = false, arg_until_set = false;
static const char *arg_unit = NULL;
static const char *arg_field = NULL;
+static bool arg_catalog = false;
static enum {
ACTION_SHOW,
@@ -82,6 +84,8 @@ static enum {
ACTION_SETUP_KEYS,
ACTION_VERIFY,
ACTION_DISK_USAGE,
+ ACTION_LIST_CATALOG,
+ ACTION_UPDATE_CATALOG
} arg_action = ACTION_SHOW;
static int help(void) {
@@ -100,6 +104,7 @@ static int help(void) {
" --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"
+ " -x --catalog Add message explanations where available\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"
@@ -116,6 +121,8 @@ static int help(void) {
" --header Show journal header information\n"
" --disk-usage Show total disk usage\n"
" -F --field=FIELD List all values a certain field takes\n"
+ " --list-catalog Show message IDs of all 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"
" --verify Verify journal file consistency\n"
@@ -139,7 +146,9 @@ static int parse_argv(int argc, char *argv[]) {
ARG_VERIFY_KEY,
ARG_DISK_USAGE,
ARG_SINCE,
- ARG_UNTIL
+ ARG_UNTIL,
+ ARG_LIST_CATALOG,
+ ARG_UPDATE_CATALOG
};
static const struct option options[] = {
@@ -168,6 +177,9 @@ static int parse_argv(int argc, char *argv[]) {
{ "until", required_argument, NULL, ARG_UNTIL },
{ "unit", required_argument, NULL, 'u' },
{ "field", required_argument, NULL, 'F' },
+ { "catalog", no_argument, NULL, 'x' },
+ { "list-catalog", no_argument, NULL, ARG_LIST_CATALOG },
+ { "update-catalog",no_argument, NULL, ARG_UPDATE_CATALOG },
{ NULL, 0, NULL, 0 }
};
@@ -176,7 +188,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:u:F:", options, NULL)) >= 0) {
+ while ((c = getopt_long(argc, argv, "hfo:an::qmbD:p:c:u:F:x", options, NULL)) >= 0) {
switch (c) {
@@ -376,6 +388,18 @@ static int parse_argv(int argc, char *argv[]) {
arg_field = optarg;
break;
+ case 'x':
+ arg_catalog = true;
+ break;
+
+ case ARG_LIST_CATALOG:
+ arg_action = ACTION_LIST_CATALOG;
+ break;
+
+ case ARG_UPDATE_CATALOG:
+ arg_action = ACTION_UPDATE_CATALOG;
+ break;
+
default:
log_error("Unknown option code %c", c);
return -EINVAL;
@@ -841,6 +865,16 @@ int main(int argc, char *argv[]) {
goto finish;
}
+ if (arg_action == ACTION_LIST_CATALOG) {
+ r = catalog_list(stdout);
+ goto finish;
+ }
+
+ if (arg_action == ACTION_UPDATE_CATALOG) {
+ r = catalog_update();
+ goto finish;
+ }
+
r = access_check();
if (r < 0)
goto finish;
@@ -1030,7 +1064,8 @@ int main(int argc, char *argv[]) {
flags =
arg_all * OUTPUT_SHOW_ALL |
(!on_tty() || pager_have()) * OUTPUT_FULL_WIDTH |
- on_tty() * OUTPUT_COLOR;
+ on_tty() * OUTPUT_COLOR |
+ arg_catalog * OUTPUT_CATALOG;
r = output_journal(stdout, j, arg_output, 0, flags);
if (r < 0)