This patchset includes the following patches: [1] [PATCH 1/7] Add sanity checks for the log levels [2] [PATCH 2/7] Remove unused log levels for kdump logger [3] [PATCH 3/7] Appropriately converts logger numeric level to syslog log level [4] [PATCH 4/7] Add the rd.kdumploglvl option to control log level in the second kernel [5] [PATCH 5/7] Support capitalizing the configuration name of log level [6] [PATCH 6/7] Update the kdump sysconfig [7] [PATCH 7/7] Doc: improve the usage documentation of the logger
Changes since v4: [1] split them into a few patches, make it easily review [2] capitalizing the configuration name of log levle [3] update the patch log and documentation accordingly
Lianbo Jiang (7): Add sanity checks for the log levels Remove unused log levels for kdump logger Appropriately converts logger numeric level to syslog log level Add the rd.kdumploglvl option to control log level in the second kernel Support capitalizing the configuration name of log level Update the kdump sysconfig Doc: improve the usage documentation of the logger
dracut-module-setup.sh | 1 - kdump-lib-initramfs.sh | 1 - kdump-logger.sh | 228 +++++++++++++++++++++------------------- kdump.sysconfig | 26 ++--- kdump.sysconfig.aarch64 | 26 ++--- kdump.sysconfig.i386 | 26 ++--- kdump.sysconfig.ppc64 | 26 ++--- kdump.sysconfig.ppc64le | 26 ++--- kdump.sysconfig.s390x | 26 ++--- kdump.sysconfig.x86_64 | 26 ++--- kexec-kdump-howto.txt | 109 +++++++++++++------ 11 files changed, 289 insertions(+), 232 deletions(-)
Let's add sanity checks for the log levels in order to avoid passing illegal log levels to the logger.
Signed-off-by: Lianbo Jiang lijiang@redhat.com --- kdump-logger.sh | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)
diff --git a/kdump-logger.sh b/kdump-logger.sh index c7afa340acfa..25fc24bb9498 100755 --- a/kdump-logger.sh +++ b/kdump-logger.sh @@ -34,15 +34,42 @@ # First of all you have to start with dlog_init() function which initializes # required variables. Don't call any other logging function before that one! # + +# @brief Check the log level. +# @retval 1 if something has gone wrong +# @retval 0 on success. +# +check_loglvl() +{ + case "$1" in + 0|1|2|3|4|5|6) + return 0 + ;; + *) + return 1 + ;; + esac +} + # @brief Initializes Logger. # @retval 1 if something has gone wrong # @retval 0 on success. # dlog_init() { local ret=0; local errmsg + [ -z "$kdump_stdloglvl" ] && kdump_stdloglvl=4 [ -z "$kdump_sysloglvl" ] && kdump_sysloglvl=4 [ -z "$kdump_kmsgloglvl" ] && kdump_kmsgloglvl=0 + + for loglvl in "$kdump_stdloglvl" "$kdump_kmsgloglvl" "$kdump_sysloglvl"; do + check_loglvl "$loglvl" + if [ $? -ne 0 ]; then + echo "Illegal log level: $kdump_stdloglvl $kdump_kmsgloglvl $kdump_sysloglvl" + return 1 + fi + done + # Skip initialization if it's already done. [ -n "$kdump_maxloglvl" ] && return 0
Previously, the range of log level is from 1 to 6, and the TRACE level and FATAL level are not used, therefore, let's remove these unused log levels.
Nowadays it has only four log levels: error(1), warn(2), info(3) and debug(4). We have to remap the numeric log level to the logger priority or syslog log level, which is finished in kdump-logger.sh module, it is invisible for user.
Signed-off-by: Lianbo Jiang lijiang@redhat.com --- kdump-logger.sh | 147 ++++++++++++++---------------------------------- 1 file changed, 42 insertions(+), 105 deletions(-)
diff --git a/kdump-logger.sh b/kdump-logger.sh index 25fc24bb9498..cf4d81041520 100755 --- a/kdump-logger.sh +++ b/kdump-logger.sh @@ -2,24 +2,18 @@ # # This comes from the dracut-logger.sh # -# The logger defined 6 logging levels: -# - dtrace() (6) -# The TRACE Level designates finer-grained informational events than the -# DEBUG. -# - ddebug (5) +# The logger defined 4 logging levels: +# - ddebug (4) # The DEBUG Level designates fine-grained informational events that are most # useful to debug an application. -# - dinfo (4) +# - dinfo (3) # The INFO level designates informational messages that highlight the # progress of the application at coarse-grained level. -# - dwarn (3) +# - dwarn (2) # The WARN level designates potentially harmful situations. -# - derror (2) +# - derror (1) # The ERROR level designates error events that might still allow the # application to continue running. -# - dfatal (1) -# The FATAL level designates very severe error events that will presumably -# lead the application to abort. # # Logging is controlled by following global variables: # - @var kdump_stdloglvl - logging level to standard error (console output) @@ -27,8 +21,8 @@ # - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time) # # If any of the variables is not set, this function set it to default: -# - @var kdump_stdloglvl = 4 (info) -# - @var kdump_sysloglvl = 4 (info) +# - @var kdump_stdloglvl = 3 (info) +# - @var kdump_sysloglvl = 3 (info) # - @var kdump_kmsgloglvl = 0 (no logging) # # First of all you have to start with dlog_init() function which initializes @@ -42,7 +36,7 @@ check_loglvl() { case "$1" in - 0|1|2|3|4|5|6) + 0|1|2|3|4) return 0 ;; *) @@ -58,8 +52,8 @@ check_loglvl() dlog_init() { local ret=0; local errmsg
- [ -z "$kdump_stdloglvl" ] && kdump_stdloglvl=4 - [ -z "$kdump_sysloglvl" ] && kdump_sysloglvl=4 + [ -z "$kdump_stdloglvl" ] && kdump_stdloglvl=3 + [ -z "$kdump_sysloglvl" ] && kdump_sysloglvl=3 [ -z "$kdump_kmsgloglvl" ] && kdump_kmsgloglvl=0
for loglvl in "$kdump_stdloglvl" "$kdump_kmsgloglvl" "$kdump_sysloglvl"; do @@ -103,83 +97,52 @@ dlog_init() { readonly kdump_maxloglvl=$maxloglvl_l export kdump_maxloglvl
- - if [[ $kdump_stdloglvl -lt 6 ]] && [[ $kdump_kmsgloglvl -lt 6 ]] && [[ $kdump_sysloglvl -lt 6 ]]; then - unset dtrace - dtrace() { :; }; - fi - - if [[ $kdump_stdloglvl -lt 5 ]] && [[ $kdump_kmsgloglvl -lt 5 ]] && [[ $kdump_sysloglvl -lt 5 ]]; then + if [[ $kdump_stdloglvl -lt 4 ]] && [[ $kdump_kmsgloglvl -lt 4 ]] && [[ $kdump_sysloglvl -lt 4 ]]; then unset ddebug ddebug() { :; }; fi
- if [[ $kdump_stdloglvl -lt 4 ]] && [[ $kdump_kmsgloglvl -lt 4 ]] && [[ $kdump_sysloglvl -lt 4 ]]; then + if [[ $kdump_stdloglvl -lt 3 ]] && [[ $kdump_kmsgloglvl -lt 3 ]] && [[ $kdump_sysloglvl -lt 3 ]]; then unset dinfo dinfo() { :; }; fi
- if [[ $kdump_stdloglvl -lt 3 ]] && [[ $kdump_kmsgloglvl -lt 3 ]] && [[ $kdump_sysloglvl -lt 3 ]]; then + if [[ $kdump_stdloglvl -lt 2 ]] && [[ $kdump_kmsgloglvl -lt 2 ]] && [[ $kdump_sysloglvl -lt 2 ]]; then unset dwarn dwarn() { :; }; unset dwarning dwarning() { :; }; fi
- if [[ $kdump_stdloglvl -lt 2 ]] && [[ $kdump_kmsgloglvl -lt 2 ]] && [[ $kdump_sysloglvl -lt 2 ]]; then + if [[ $kdump_stdloglvl -lt 1 ]] && [[ $kdump_kmsgloglvl -lt 1 ]] && [[ $kdump_sysloglvl -lt 1 ]]; then unset derror derror() { :; }; fi
- if [[ $kdump_stdloglvl -lt 1 ]] && [[ $kdump_kmsgloglvl -lt 1 ]] && [[ $kdump_sysloglvl -lt 1 ]]; then - unset dfatal - dfatal() { :; }; - fi - [ -n "$errmsg" ] && derror "$errmsg"
return $ret }
-## @brief Converts numeric logging level to the first letter of level name. -# -# @param lvl Numeric logging level in range from 1 to 6. -# @retval 1 if @a lvl is out of range. -# @retval 0 if @a lvl is correct. -# @result Echoes first letter of level name. -_lvl2char() { - case "$1" in - 1) echo F;; - 2) echo E;; - 3) echo W;; - 4) echo I;; - 5) echo D;; - 6) echo T;; - *) return 1;; - esac -} - ## @brief Converts numeric level to logger priority defined by POSIX.2. # -# @param lvl Numeric logging level in range from 1 to 6. +# @param lvl Numeric logging level in range from 1 to 4. # @retval 1 if @a lvl is out of range. # @retval 0 if @a lvl is correct. # @result Echoes logger priority. _lvl2syspri() { case "$1" in - 1) echo crit;; - 2) echo error;; - 3) echo warning;; - 4) echo info;; - 5) echo debug;; - 6) echo debug;; + 1) echo error;; + 2) echo warning;; + 3) echo info;; + 4) echo debug;; *) return 1;; esac }
## @brief Converts logger numeric level to syslog log level # -# @param lvl Numeric logging level in range from 1 to 6. +# @param lvl Numeric logging level in range from 1 to 4. # @retval 1 if @a lvl is out of range. # @retval 0 if @a lvl is correct. # @result Echoes kernel console numeric log level @@ -189,13 +152,12 @@ _lvl2syspri() { # <tt> # none -> LOG_EMERG (0) # none -> LOG_ALERT (1) -# FATAL(1) -> LOG_CRIT (2) -# ERROR(2) -> LOG_ERR (3) -# WARN(3) -> LOG_WARNING (4) +# none -> LOG_CRIT (2) +# ERROR(1) -> LOG_ERR (3) +# WARN(2) -> LOG_WARNING (4) # none -> LOG_NOTICE (5) -# INFO(4) -> LOG_INFO (6) -# DEBUG(5) -> LOG_DEBUG (7) -# TRACE(6) / +# INFO(3) -> LOG_INFO (6) +# DEBUG(4) -> LOG_DEBUG (7) # </tt> # # @see /usr/include/sys/syslog.h @@ -203,29 +165,27 @@ _dlvl2syslvl() { local lvl
case "$1" in - 1) lvl=2;; - 2) lvl=3;; - 3) lvl=4;; - 4) lvl=6;; - 5) lvl=7;; - 6) lvl=7;; + 1) lvl=3;; + 2) lvl=4;; + 3) lvl=6;; + 4) lvl=7;; *) return 1;; esac
[ -s /proc/vmcore ] && echo $((24+$lvl)) || echo $((8+$lvl)) }
-## @brief Prints to stderr and/or writes to file, to syslog and/or /dev/kmsg -# given message with given level (priority). +## @brief Prints to stderr, to syslog and/or /dev/kmsg given message with +# given level (priority). # # @param lvl Numeric logging level. # @param msg Message. # @retval 0 It's always returned, even if logging failed. # # @note This function is not supposed to be called manually. Please use -# dtrace(), ddebug(), or others instead which wrap this one. +# dinfo(), ddebug(), or others instead which wrap this one. # -# This is core logging function which logs given message to standard error, file +# This is core logging function which logs given message to standard error # and/or syslog (with POSIX shell command <tt>logger</tt>) and/or to /dev/kmsg. # The format is following: # @@ -236,16 +196,13 @@ _dlvl2syslvl() { # # Message to syslog is sent with tag @c kdump. Priorities are mapped as # following: -# - @c FATAL to @c crit # - @c ERROR to @c error # - @c WARN to @c warning # - @c INFO to @c info -# - @c DEBUG and @c TRACE both to @c debug +# - @c DEBUG to @c debug _do_dlog() { local lvl="$1"; shift - local lvlc=$(_lvl2char "$lvl") || return 0 local msg="$*" - local lmsg="$lvlc: $*"
[[ $lvl -le $kdump_stdloglvl ]] && printf -- 'kdump: %s\n' "$msg" >&2
@@ -268,7 +225,7 @@ _do_dlog() { # @retval 0 It's always returned, even if logging failed. # # @note This function is not supposed to be called manually. Please use -# dtrace(), ddebug(), or others instead which wrap this one. +# dinfo(), ddebug(), or others instead which wrap this one. # # This function calls _do_dlog() either with parameter msg, or if # none is given, it will read standard input and will use every line as @@ -290,43 +247,33 @@ dlog() { fi }
-## @brief Logs message at TRACE level (6) -# -# @param msg Message. -# @retval 0 It's always returned, even if logging failed. -dtrace() { - set +x - dlog 6 "$@" - [ -n "$debug" ] && set -x || : -} - -## @brief Logs message at DEBUG level (5) +## @brief Logs message at DEBUG level (4) # # @param msg Message. # @retval 0 It's always returned, even if logging failed. ddebug() { set +x - dlog 5 "$@" + dlog 4 "$@" [ -n "$debug" ] && set -x || : }
-## @brief Logs message at INFO level (4) +## @brief Logs message at INFO level (3) # # @param msg Message. # @retval 0 It's always returned, even if logging failed. dinfo() { set +x - dlog 4 "$@" + dlog 3 "$@" [ -n "$debug" ] && set -x || : }
-## @brief Logs message at WARN level (3) +## @brief Logs message at WARN level (2) # # @param msg Message. # @retval 0 It's always returned, even if logging failed. dwarn() { set +x - dlog 3 "$@" + dlog 2 "$@" [ -n "$debug" ] && set -x || : }
@@ -340,21 +287,11 @@ dwarning() { [ -n "$debug" ] && set -x || : }
-## @brief Logs message at ERROR level (2) +## @brief Logs message at ERROR level (1) # # @param msg Message. # @retval 0 It's always returned, even if logging failed. derror() { - set +x - dlog 2 "$@" - [ -n "$debug" ] && set -x || : -} - -## @brief Logs message at FATAL level (1) -# -# @param msg Message. -# @retval 0 It's always returned, even if logging failed. -dfatal() { set +x dlog 1 "$@" [ -n "$debug" ] && set -x || :
The kdump-logger will be used by the system service(daemons), so let's appropriately convert the logger numeric level to syslog level with the facility(daemon). The number is constructed by multiplying the facility by 8 and then adding the level.
About The Syslog Protocol, please refer to the RFC5424 for more details.
Signed-off-by: Lianbo Jiang lijiang@redhat.com --- kdump-logger.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/kdump-logger.sh b/kdump-logger.sh index cf4d81041520..c81e614e907e 100755 --- a/kdump-logger.sh +++ b/kdump-logger.sh @@ -172,7 +172,10 @@ _dlvl2syslvl() { *) return 1;; esac
- [ -s /proc/vmcore ] && echo $((24+$lvl)) || echo $((8+$lvl)) + # The number is constructed by multiplying the facility by 8 and then + # adding the level. + # About The Syslog Protocol, please refer to the RFC5424 for more details. + echo $((24+$lvl)) }
## @brief Prints to stderr, to syslog and/or /dev/kmsg given message with
Let's add the rd.kdumploglvl option to control log level in the second kernel, which can make us avoid rebuilding the kdump initramfs after we change the log level in /etc/sysconfig/kdump.
Signed-off-by: Lianbo Jiang lijiang@redhat.com --- dracut-module-setup.sh | 1 - kdump-lib-initramfs.sh | 1 - kdump-logger.sh | 48 +++++++++++++++++++++++++++++++++++++----- 3 files changed, 43 insertions(+), 7 deletions(-)
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh index 911a8b84de9d..3d526f11d410 100755 --- a/dracut-module-setup.sh +++ b/dracut-module-setup.sh @@ -819,7 +819,6 @@ install() { kdump_install_random_seed fi dracut_install -o /etc/adjtime /etc/localtime - inst_simple "/etc/sysconfig/kdump" inst "$moddir/monitor_dd_progress" "/kdumpscripts/monitor_dd_progress" chmod +x ${initdir}/kdumpscripts/monitor_dd_progress inst "/bin/dd" "/bin/dd" diff --git a/kdump-lib-initramfs.sh b/kdump-lib-initramfs.sh index 14aac7b98d44..d8d48935b32e 100755 --- a/kdump-lib-initramfs.sh +++ b/kdump-lib-initramfs.sh @@ -1,6 +1,5 @@ # These variables and functions are useful in 2nd kernel
-. /etc/sysconfig/kdump . /lib/kdump-lib.sh
KDUMP_PATH="/var/crash" diff --git a/kdump-logger.sh b/kdump-logger.sh index c81e614e907e..6d214af05125 100755 --- a/kdump-logger.sh +++ b/kdump-logger.sh @@ -20,15 +20,43 @@ # - @var kdump_sysloglvl - logging level to syslog (by logger command) # - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time) # -# If any of the variables is not set, this function set it to default: -# - @var kdump_stdloglvl = 3 (info) -# - @var kdump_sysloglvl = 3 (info) -# - @var kdump_kmsgloglvl = 0 (no logging) +# If any of the variables is not set, the function dlog_init() sets it to default: +# - In the first kernel: +# - @var kdump_stdloglvl = 3 (info) +# - @var kdump_sysloglvl = 0 (no logging) +# - @var kdump_kmsgloglvl = 0 (no logging) +# +# -In the second kernel: +# - @var kdump_stdloglvl = 0 (no logging) +# - @var kdump_sysloglvl = 3 (info) +# - @var kdump_kmsgloglvl = 0 (no logging) # # First of all you have to start with dlog_init() function which initializes # required variables. Don't call any other logging function before that one! #
+# The dracut-lib.sh is only available in the second kernel, and it won't +# be used in the first kernel because the dracut-lib.sh is invisible in +# the first kernel. +if [ -f /lib/dracut-lib.sh ]; then + . /lib/dracut-lib.sh +fi + +# @brief Get the log level from kernel command line. +# @retval 1 if something has gone wrong +# @retval 0 on success. +# +get_kdump_loglvl() +{ + (type -p getarg) && kdump_sysloglvl=$(getarg rd.kdumploglvl) + [ -z "$kdump_sysloglvl" ] && return 1; + + (type -p isdigit) && isdigit $kdump_sysloglvl + [ $? -ne 0 ] && return 1; + + return 0 +} + # @brief Check the log level. # @retval 1 if something has gone wrong # @retval 0 on success. @@ -52,8 +80,18 @@ check_loglvl() dlog_init() { local ret=0; local errmsg
+ if [ -s /proc/vmcore ];then + get_kdump_loglvl + if [ $? -ne 0 ];then + logger -t "kdump[$$]" -p warn -- "Kdump is using the default log level(3)." + kdump_sysloglvl=3 + fi + kdump_stdloglvl=0 + kdump_kmsgloglvl=0 + fi + [ -z "$kdump_stdloglvl" ] && kdump_stdloglvl=3 - [ -z "$kdump_sysloglvl" ] && kdump_sysloglvl=3 + [ -z "$kdump_sysloglvl" ] && kdump_sysloglvl=0 [ -z "$kdump_kmsgloglvl" ] && kdump_kmsgloglvl=0
for loglvl in "$kdump_stdloglvl" "$kdump_kmsgloglvl" "$kdump_sysloglvl"; do
In the /etc/sysconfig/kdump, we usually use the uppercase configuration name for all options. So let's use the same method to handle this.
Signed-off-by: Lianbo Jiang lijiang@redhat.com --- kdump-logger.sh | 9 +++++++++ 1 file changed, 9 insertions(+)
diff --git a/kdump-logger.sh b/kdump-logger.sh index 6d214af05125..370e5e898b41 100755 --- a/kdump-logger.sh +++ b/kdump-logger.sh @@ -35,6 +35,11 @@ # required variables. Don't call any other logging function before that one! #
+# Define vairables for the log levels in this module. +kdump_stdloglvl="" +kdump_sysloglvl="" +kdump_kmsgloglvl="" + # The dracut-lib.sh is only available in the second kernel, and it won't # be used in the first kernel because the dracut-lib.sh is invisible in # the first kernel. @@ -88,6 +93,10 @@ dlog_init() { fi kdump_stdloglvl=0 kdump_kmsgloglvl=0 + else + kdump_stdloglvl=$KDUMP_STDLOGLVL + kdump_sysloglvl=$KDUMP_SYSLOGLVL + kdump_kmsgloglvl=$KDUMP_KMSGLOGLVL fi
[ -z "$kdump_stdloglvl" ] && kdump_stdloglvl=3
Some unused log levels have been removed, and kdump has used the different options to control the log levels for the first kernel and the second kernel. Therefore, let's update the kdump sysconfig accordingly.
Signed-off-by: Lianbo Jiang lijiang@redhat.com --- kdump.sysconfig | 26 +++++++++++++------------- kdump.sysconfig.aarch64 | 26 +++++++++++++------------- kdump.sysconfig.i386 | 26 +++++++++++++------------- kdump.sysconfig.ppc64 | 26 +++++++++++++------------- kdump.sysconfig.ppc64le | 26 +++++++++++++------------- kdump.sysconfig.s390x | 26 +++++++++++++------------- kdump.sysconfig.x86_64 | 26 +++++++++++++------------- 7 files changed, 91 insertions(+), 91 deletions(-)
diff --git a/kdump.sysconfig b/kdump.sysconfig index 52a0b9249fe7..30f0c63801f5 100644 --- a/kdump.sysconfig +++ b/kdump.sysconfig @@ -36,18 +36,18 @@ KEXEC_ARGS="" #What is the image type used for kdump KDUMP_IMG="vmlinuz"
-# Logging is controlled by following global variables: -# - @var kdump_stdloglvl - logging level to standard error (console output) -# - @var kdump_sysloglvl - logging level to syslog (by logger command) -# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time) -# If any of the variables is not set, this function set it to default: -# - @var kdump_stdloglvl=4 (info) -# - @var kdump_sysloglvl=4 (info) -# - @var kdump_kmsgloglvl=0 (no logging) +# Logging is controlled by following variables in the first kernel: +# - @var KDUMP_STDLOGLVL - logging level to standard error (console output) +# - @var KDUMP_SYSLOGLVL - logging level to syslog (by logger command) +# - @var KDUMP_KMSGLOGLVL - logging level to /dev/kmsg (only for boot-time) # -# Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6) +# In the second kernel, kdump will use the rd.kdumploglvl option to set the +# log level in the above KDUMP_COMMANDLINE_APPEND. +# - @var rd.kdumploglvl - logging level to syslog (by logger command) +# - for example: add the rd.kdumploglvl=3 option to KDUMP_COMMANDLINE_APPEND # -# For example: the following configurations indicate that kdump messages will be printed -# to console and journald for debugging case. -# kdump_sysloglvl=5 -# kdump_stdloglvl=5 +# Logging levels: no logging(0), error(1),warn(2),info(3),debug(4) +# +# KDUMP_STDLOGLVL=3 +# KDUMP_SYSLOGLVL=0 +# KDUMP_KMSGLOGLVL=0 diff --git a/kdump.sysconfig.aarch64 b/kdump.sysconfig.aarch64 index 1d75979df03e..6f7830a8c3e8 100644 --- a/kdump.sysconfig.aarch64 +++ b/kdump.sysconfig.aarch64 @@ -36,18 +36,18 @@ KEXEC_ARGS="" #What is the image type used for kdump KDUMP_IMG="vmlinuz"
-# Logging is controlled by following global variables: -# - @var kdump_stdloglvl - logging level to standard error (console output) -# - @var kdump_sysloglvl - logging level to syslog (by logger command) -# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time) -# If any of the variables is not set, this function set it to default: -# - @var kdump_stdloglvl=4 (info) -# - @var kdump_sysloglvl=4 (info) -# - @var kdump_kmsgloglvl=0 (no logging) +# Logging is controlled by following variables in the first kernel: +# - @var KDUMP_STDLOGLVL - logging level to standard error (console output) +# - @var KDUMP_SYSLOGLVL - logging level to syslog (by logger command) +# - @var KDUMP_KMSGLOGLVL - logging level to /dev/kmsg (only for boot-time) # -# Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6) +# In the second kernel, kdump will use the rd.kdumploglvl option to set the +# log level in the above KDUMP_COMMANDLINE_APPEND. +# - @var rd.kdumploglvl - logging level to syslog (by logger command) +# - for example: add the rd.kdumploglvl=3 option to KDUMP_COMMANDLINE_APPEND # -# For example: the following configurations indicate that kdump messages will be printed -# to console and journald for debugging case. -# kdump_sysloglvl=5 -# kdump_stdloglvl=5 +# Logging levels: no logging(0), error(1),warn(2),info(3),debug(4) +# +# KDUMP_STDLOGLVL=3 +# KDUMP_SYSLOGLVL=0 +# KDUMP_KMSGLOGLVL=0 diff --git a/kdump.sysconfig.i386 b/kdump.sysconfig.i386 index 2eb9705e32e9..d2de7d61dd94 100644 --- a/kdump.sysconfig.i386 +++ b/kdump.sysconfig.i386 @@ -39,18 +39,18 @@ KDUMP_IMG="vmlinuz" #What is the images extension. Relocatable kernels don't have one KDUMP_IMG_EXT=""
-# Logging is controlled by following global variables: -# - @var kdump_stdloglvl - logging level to standard error (console output) -# - @var kdump_sysloglvl - logging level to syslog (by logger command) -# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time) -# If any of the variables is not set, this function set it to default: -# - @var kdump_stdloglvl=4 (info) -# - @var kdump_sysloglvl=4 (info) -# - @var kdump_kmsgloglvl=0 (no logging) +# Logging is controlled by following variables in the first kernel: +# - @var KDUMP_STDLOGLVL - logging level to standard error (console output) +# - @var KDUMP_SYSLOGLVL - logging level to syslog (by logger command) +# - @var KDUMP_KMSGLOGLVL - logging level to /dev/kmsg (only for boot-time) # -# Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6) +# In the second kernel, kdump will use the rd.kdumploglvl option to set the +# log level in the above KDUMP_COMMANDLINE_APPEND. +# - @var rd.kdumploglvl - logging level to syslog (by logger command) +# - for example: add the rd.kdumploglvl=3 option to KDUMP_COMMANDLINE_APPEND # -# For example: the following configurations indicate that kdump messages will be printed -# to console and journald for debugging case. -# kdump_sysloglvl=5 -# kdump_stdloglvl=5 +# Logging levels: no logging(0), error(1),warn(2),info(3),debug(4) +# +# KDUMP_STDLOGLVL=3 +# KDUMP_SYSLOGLVL=0 +# KDUMP_KMSGLOGLVL=0 diff --git a/kdump.sysconfig.ppc64 b/kdump.sysconfig.ppc64 index 24279ff34211..39b69bb8d72b 100644 --- a/kdump.sysconfig.ppc64 +++ b/kdump.sysconfig.ppc64 @@ -41,18 +41,18 @@ KDUMP_IMG_EXT=""
#Specify the action after failure
-# Logging is controlled by following global variables: -# - @var kdump_stdloglvl - logging level to standard error (console output) -# - @var kdump_sysloglvl - logging level to syslog (by logger command) -# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time) -# If any of the variables is not set, this function set it to default: -# - @var kdump_stdloglvl=4 (info) -# - @var kdump_sysloglvl=4 (info) -# - @var kdump_kmsgloglvl=0 (no logging) +# Logging is controlled by following variables in the first kernel: +# - @var KDUMP_STDLOGLVL - logging level to standard error (console output) +# - @var KDUMP_SYSLOGLVL - logging level to syslog (by logger command) +# - @var KDUMP_KMSGLOGLVL - logging level to /dev/kmsg (only for boot-time) # -# Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6) +# In the second kernel, kdump will use the rd.kdumploglvl option to set the +# log level in the above KDUMP_COMMANDLINE_APPEND. +# - @var rd.kdumploglvl - logging level to syslog (by logger command) +# - for example: add the rd.kdumploglvl=3 option to KDUMP_COMMANDLINE_APPEND # -# For example: the following configurations indicate that kdump messages will be printed -# to console and journald for debugging case. -# kdump_sysloglvl=5 -# kdump_stdloglvl=5 +# Logging levels: no logging(0), error(1),warn(2),info(3),debug(4) +# +# KDUMP_STDLOGLVL=3 +# KDUMP_SYSLOGLVL=0 +# KDUMP_KMSGLOGLVL=0 diff --git a/kdump.sysconfig.ppc64le b/kdump.sysconfig.ppc64le index 24279ff34211..39b69bb8d72b 100644 --- a/kdump.sysconfig.ppc64le +++ b/kdump.sysconfig.ppc64le @@ -41,18 +41,18 @@ KDUMP_IMG_EXT=""
#Specify the action after failure
-# Logging is controlled by following global variables: -# - @var kdump_stdloglvl - logging level to standard error (console output) -# - @var kdump_sysloglvl - logging level to syslog (by logger command) -# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time) -# If any of the variables is not set, this function set it to default: -# - @var kdump_stdloglvl=4 (info) -# - @var kdump_sysloglvl=4 (info) -# - @var kdump_kmsgloglvl=0 (no logging) +# Logging is controlled by following variables in the first kernel: +# - @var KDUMP_STDLOGLVL - logging level to standard error (console output) +# - @var KDUMP_SYSLOGLVL - logging level to syslog (by logger command) +# - @var KDUMP_KMSGLOGLVL - logging level to /dev/kmsg (only for boot-time) # -# Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6) +# In the second kernel, kdump will use the rd.kdumploglvl option to set the +# log level in the above KDUMP_COMMANDLINE_APPEND. +# - @var rd.kdumploglvl - logging level to syslog (by logger command) +# - for example: add the rd.kdumploglvl=3 option to KDUMP_COMMANDLINE_APPEND # -# For example: the following configurations indicate that kdump messages will be printed -# to console and journald for debugging case. -# kdump_sysloglvl=5 -# kdump_stdloglvl=5 +# Logging levels: no logging(0), error(1),warn(2),info(3),debug(4) +# +# KDUMP_STDLOGLVL=3 +# KDUMP_SYSLOGLVL=0 +# KDUMP_KMSGLOGLVL=0 diff --git a/kdump.sysconfig.s390x b/kdump.sysconfig.s390x index 5e1cb5a7ad89..f9218e5d1365 100644 --- a/kdump.sysconfig.s390x +++ b/kdump.sysconfig.s390x @@ -42,18 +42,18 @@ KDUMP_IMG="vmlinuz" #What is the images extension. Relocatable kernels don't have one KDUMP_IMG_EXT=""
-# Logging is controlled by following global variables: -# - @var kdump_stdloglvl - logging level to standard error (console output) -# - @var kdump_sysloglvl - logging level to syslog (by logger command) -# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time) -# If any of the variables is not set, this function set it to default: -# - @var kdump_stdloglvl=4 (info) -# - @var kdump_sysloglvl=4 (info) -# - @var kdump_kmsgloglvl=0 (no logging) +# Logging is controlled by following variables in the first kernel: +# - @var KDUMP_STDLOGLVL - logging level to standard error (console output) +# - @var KDUMP_SYSLOGLVL - logging level to syslog (by logger command) +# - @var KDUMP_KMSGLOGLVL - logging level to /dev/kmsg (only for boot-time) # -# Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6) +# In the second kernel, kdump will use the rd.kdumploglvl option to set the +# log level in the above KDUMP_COMMANDLINE_APPEND. +# - @var rd.kdumploglvl - logging level to syslog (by logger command) +# - for example: add the rd.kdumploglvl=3 option to KDUMP_COMMANDLINE_APPEND # -# For example: the following configurations indicate that kdump messages will be printed -# to console and journald for debugging case. -# kdump_sysloglvl=5 -# kdump_stdloglvl=5 +# Logging levels: no logging(0), error(1),warn(2),info(3),debug(4) +# +# KDUMP_STDLOGLVL=3 +# KDUMP_SYSLOGLVL=0 +# KDUMP_KMSGLOGLVL=0 diff --git a/kdump.sysconfig.x86_64 b/kdump.sysconfig.x86_64 index eb1c53824241..052189327f74 100644 --- a/kdump.sysconfig.x86_64 +++ b/kdump.sysconfig.x86_64 @@ -39,18 +39,18 @@ KDUMP_IMG="vmlinuz" #What is the images extension. Relocatable kernels don't have one KDUMP_IMG_EXT=""
-# Logging is controlled by following global variables: -# - @var kdump_stdloglvl - logging level to standard error (console output) -# - @var kdump_sysloglvl - logging level to syslog (by logger command) -# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time) -# If any of the variables is not set, this function set it to default: -# - @var kdump_stdloglvl=4 (info) -# - @var kdump_sysloglvl=4 (info) -# - @var kdump_kmsgloglvl=0 (no logging) +# Logging is controlled by following variables in the first kernel: +# - @var KDUMP_STDLOGLVL - logging level to standard error (console output) +# - @var KDUMP_SYSLOGLVL - logging level to syslog (by logger command) +# - @var KDUMP_KMSGLOGLVL - logging level to /dev/kmsg (only for boot-time) # -# Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6) +# In the second kernel, kdump will use the rd.kdumploglvl option to set the +# log level in the above KDUMP_COMMANDLINE_APPEND. +# - @var rd.kdumploglvl - logging level to syslog (by logger command) +# - for example: add the rd.kdumploglvl=3 option to KDUMP_COMMANDLINE_APPEND # -# For example: the following configurations indicate that kdump messages will be printed -# to console and journald for debugging case. -# kdump_sysloglvl=5 -# kdump_stdloglvl=5 +# Logging levels: no logging(0), error(1),warn(2),info(3),debug(4) +# +# KDUMP_STDLOGLVL=3 +# KDUMP_SYSLOGLVL=0 +# KDUMP_KMSGLOGLVL=0
Let's remove some redundant descriptions in the usage documentation of the logger, and make it clear.
Signed-off-by: Lianbo Jiang lijiang@redhat.com --- kexec-kdump-howto.txt | 109 +++++++++++++++++++++++++++++------------- 1 file changed, 77 insertions(+), 32 deletions(-)
diff --git a/kexec-kdump-howto.txt b/kexec-kdump-howto.txt index 5f57a8428e4f..447bc5447886 100644 --- a/kexec-kdump-howto.txt +++ b/kexec-kdump-howto.txt @@ -888,35 +888,80 @@ Debugging Tips
- Using the logger to output kdump log messages
- Currently, kdump messages are printed with the 'echo' command or redirect - to console, and which does not support to output kdump messages according - to the log level. - - That is not convenient to debug kdump issues, we usually need to capture - additional debugging information via the modification of the options or the - scripts like kdumpctl, mkdumprd, etc. Because there is no complete debugging - messages, which could waste valuable time. - - To cope with this challenging, we introduce the logger to output the kdump - messages according to the log level, and provide a chance to save logs to - the journald if the journald service is available, and then dump all logs - to a file, otherwise dump the logs with the dmesg to a file. - - Logging is controlled by following global variables: - - @var kdump_stdloglvl - logging level to standard error (console output) - - @var kdump_sysloglvl - logging level to syslog (by logger command) - - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time) - If any of the variables is not set, this function set it to default: - - @var kdump_stdloglvl=4 (info) - - @var kdump_sysloglvl=4 (info) - - @var kdump_kmsgloglvl=0 (no logging) - - Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6) - - We can easily configure the above variables in the /etc/sysconfig/kdump. For - example: - kdump_sysloglvl=5 - kdump_stdloglvl=5 - - The above configurations indicate that kdump messages will be printed to the - console and journald if the journald service is enabled. + You can configure the kdump log level for the first kernel in the + /etc/sysconfig/kdump. For example: + + KDUMP_STDLOGLVL=3 + KDUMP_SYSLOGLVL=0 + KDUMP_KMSGLOGLVL=0 + + The above configurations indicate that kdump messages will be printed + to the console, and the KDUMP_STDLOGLVL is set to 3(info), but the + KDUMP_SYSLOGLVL and KDUMP_KMSGLOGLVL are set to 0(no logging). This + is also the current default log levels in the first kernel. + + In the second kernel, you can add the 'rd.kdumploglvl=X' option to the + KDUMP_COMMANDLINE_APPEND in the /etc/sysconfig/kdump so that you can also + set the log levels for the second kernel. The 'X' represents the logging + levels, the default log level is 3(info) in the second kernel, for example: + + # cat /etc/sysconfig/kdump |grep rd.kdumploglvl + KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices cgroup_disable=memory mce=off numa=off udev.children-max=2 panic=10 acpi_no_memhotplug transparent_hugepage=never nokaslr hest_disable novmcoredd rd.kdumploglvl=3" + + Logging levels: no logging(0), error(1),warn(2),info(3),debug(4) + + The ERROR level designates error events that might still allow the application + to continue running. + + The WARN level designates potentially harmful situations. + + The INFO level designates informational messages that highlight the progress + of the application at coarse-grained level. + + The DEBUG level designates fine-grained informational events that are most + useful to debug an application. + + Note: if you set the log level to 0, that will disable the logs at the + corresponding log level, which indicates that it has no log output. + + At present, the logger works in both the first kernel(kdump service debugging) + and the second kernel. + + In the first kernel, you can find the historical logs with the journalctl + command and check kdump service debugging information. In addition, the + 'kexec -d' debugging messages are also saved to /var/log/kdump.log in the + first kernel. For example: + + [root@ibm-z-109 ~]# ls -al /var/log/kdump.log + -rw-r--r--. 1 root root 63238 Oct 28 06:40 /var/log/kdump.log + + If you want to get the debugging information of building kdump initramfs, you + can enable the '--debug' option for the dracut_args in the /etc/kdump.conf, and + then rebuild the kdump initramfs as below: + + # systemctl restart kdump.service + + That will rebuild the kdump initramfs and gerenate some logs to journald, you + can find the dracut logs with the journalctl command. + + In the second kernel, kdump will automatically put the kexec-dmesg.log to a same + directory with the vmcore, the log file includes the debugging messages like dmesg + and journald logs. For example: + + [root@ibm-z-109 ~]# ls -al /var/crash/127.0.0.1-2020-10-28-02:01:23/ + drwxr-xr-x. 2 root root 67 Oct 28 02:02 . + drwxr-xr-x. 6 root root 154 Oct 28 02:01 .. + -rw-r--r--. 1 root root 21164 Oct 28 02:01 kexec-dmesg.log + -rw-------. 1 root root 74238698 Oct 28 02:01 vmcore + -rw-r--r--. 1 root root 17532 Oct 28 02:01 vmcore-dmesg.txt + + If you want to get more debugging information in the second kernel, you can add + the 'rd.debug' option to the KDUMP_COMMANDLINE_APPEND in the /etc/sysconfig/kdump, + and then reload them in order to make the changes take effect. + + In addition, you can also add the 'rd.memdebug=X' option to the KDUMP_COMMANDLINE_APPEND + in the /etc/sysconfig/kdump in order to output the additional information about + kernel module memory consumption during loading. + + For more details, please refer to the /etc/sysconfig/kdump, or the man page of + dracut.cmdline and kdump.conf.
On Thu, Nov 12, 2020 at 11:56 PM Lianbo Jiang lijiang@redhat.com wrote:
This patchset includes the following patches: [1] [PATCH 1/7] Add sanity checks for the log levels [2] [PATCH 2/7] Remove unused log levels for kdump logger [3] [PATCH 3/7] Appropriately converts logger numeric level to syslog log level [4] [PATCH 4/7] Add the rd.kdumploglvl option to control log level in the second kernel [5] [PATCH 5/7] Support capitalizing the configuration name of log level [6] [PATCH 6/7] Update the kdump sysconfig [7] [PATCH 7/7] Doc: improve the usage documentation of the logger
Changes since v4: [1] split them into a few patches, make it easily review [2] capitalizing the configuration name of log levle [3] update the patch log and documentation accordingly
Lianbo Jiang (7): Add sanity checks for the log levels Remove unused log levels for kdump logger Appropriately converts logger numeric level to syslog log level Add the rd.kdumploglvl option to control log level in the second kernel Support capitalizing the configuration name of log level Update the kdump sysconfig Doc: improve the usage documentation of the logger
dracut-module-setup.sh | 1 - kdump-lib-initramfs.sh | 1 - kdump-logger.sh | 228 +++++++++++++++++++++------------------- kdump.sysconfig | 26 ++--- kdump.sysconfig.aarch64 | 26 ++--- kdump.sysconfig.i386 | 26 ++--- kdump.sysconfig.ppc64 | 26 ++--- kdump.sysconfig.ppc64le | 26 ++--- kdump.sysconfig.s390x | 26 ++--- kdump.sysconfig.x86_64 | 26 ++--- kexec-kdump-howto.txt | 109 +++++++++++++------ 11 files changed, 289 insertions(+), 232 deletions(-)
-- 2.17.1
Looks good to me, and works.
Acked-by: Kairui Song kasong@redhat.com
-- Best Regards, Kairui Song