Gitweb:
https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=9aea6ae956543995b30...
Commit: 9aea6ae956543995b30282c984af5fdad2347f07
Parent: ccfbd505fea2f259f7c89dc23b020b838363a611
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Fri Feb 22 12:01:20 2019 -0600
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Tue Feb 26 10:03:44 2019 -0600
logging: add command[pid] and timestamp to file and verbose output
Without this, the output from different commands in a single
log file could not be separated.
Change the default "indent" setting to 0 so that the default
debug output does not include variable spaces in the middle
of debug lines.
---
lib/commands/toolcontext.c | 4 +-
lib/commands/toolcontext.h | 1 -
lib/config/config_settings.h | 2 +-
lib/config/defaults.h | 2 +-
lib/log/log.c | 66 +++++++++++++++++++++++++++++++++--------
lib/misc/lvm-globals.c | 44 +++++++++++++++++++++++-----
lib/misc/lvm-globals.h | 4 ++-
tools/lvmcmdline.c | 7 ++--
8 files changed, 100 insertions(+), 30 deletions(-)
diff --git a/lib/commands/toolcontext.c b/lib/commands/toolcontext.c
index 62e21f7..8abe0df 100644
--- a/lib/commands/toolcontext.c
+++ b/lib/commands/toolcontext.c
@@ -320,8 +320,8 @@ static void _init_logging(struct cmd_context *cmd)
cmd->default_settings.msg_prefix = find_config_tree_str_allow_empty(cmd,
log_prefix_CFG, NULL);
init_msg_prefix(cmd->default_settings.msg_prefix);
- cmd->default_settings.cmd_name = find_config_tree_bool(cmd, log_command_names_CFG,
NULL);
- init_cmd_name(cmd->default_settings.cmd_name);
+ /* so that file and verbose output have a command prefix */
+ init_log_command(0, 0);
/* Test mode */
cmd->default_settings.test =
diff --git a/lib/commands/toolcontext.h b/lib/commands/toolcontext.h
index e8ce312..959c153 100644
--- a/lib/commands/toolcontext.h
+++ b/lib/commands/toolcontext.h
@@ -44,7 +44,6 @@ struct config_info {
const char *fmt_name;
const char *dmeventd_executable;
uint64_t unit_factor;
- int cmd_name; /* Show command name? */
mode_t umask;
char unit_type;
char _padding[1];
diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h
index e15494d..0e305e4 100644
--- a/lib/config/config_settings.h
+++ b/lib/config/config_settings.h
@@ -812,7 +812,7 @@ cfg(log_level_CFG, "level", log_CFG_SECTION, 0,
CFG_TYPE_INT, DEFAULT_LOGLEVEL,
"There are 6 syslog-like log levels currently in use: 2 to 7 inclusive.\n"
"7 is the most verbose (LOG_DEBUG).\n")
-cfg(log_indent_CFG, "indent", log_CFG_SECTION, 0, CFG_TYPE_BOOL,
DEFAULT_INDENT, vsn(1, 0, 0), NULL, 0, NULL,
+cfg(log_indent_CFG, "indent", log_CFG_SECTION, CFG_DEFAULT_COMMENTED,
CFG_TYPE_BOOL, DEFAULT_INDENT, vsn(1, 0, 0), NULL, 0, NULL,
"Indent messages according to their severity.\n")
cfg(log_command_names_CFG, "command_names", log_CFG_SECTION, 0, CFG_TYPE_BOOL,
DEFAULT_CMD_NAME, vsn(1, 0, 0), NULL, 0, NULL,
diff --git a/lib/config/defaults.h b/lib/config/defaults.h
index cb013c6..affb4c9 100644
--- a/lib/config/defaults.h
+++ b/lib/config/defaults.h
@@ -221,7 +221,7 @@
#define DEFAULT_VERBOSE 0
#define DEFAULT_SILENT 0
#define DEFAULT_LOGLEVEL 0
-#define DEFAULT_INDENT 1
+#define DEFAULT_INDENT 0
#define DEFAULT_ABORT_ON_INTERNAL_ERRORS 0
#define DEFAULT_UNITS "r"
#define DEFAULT_SUFFIX 1
diff --git a/lib/log/log.c b/lib/log/log.c
index f6aaa04..8cea402 100644
--- a/lib/log/log.c
+++ b/lib/log/log.c
@@ -24,6 +24,7 @@
#include <stdarg.h>
#include <syslog.h>
#include <ctype.h>
+#include <time.h>
static FILE *_log_file;
static char _log_file_path[PATH_MAX];
@@ -36,7 +37,7 @@ static uint64_t _log_file_max_lines = 0;
static uint64_t _log_file_lines = 0;
static int _log_direct = 0;
static int _log_while_suspended = 0;
-static int _indent = 1;
+static int _indent = 0;
static int _log_suppress = 0;
static char _msg_prefix[30] = " ";
static int _already_logging = 0;
@@ -471,12 +472,40 @@ const char *log_get_report_object_type_name(log_report_object_type_t
object_type
return log_object_type_names[object_type];
}
+static void _set_time_prefix(char *prefix, int buflen)
+{
+
+ struct timespec ts;
+ struct tm time_info;
+ int len;
+
+ if (clock_gettime(CLOCK_REALTIME, &ts) < 0)
+ goto fail;
+
+ if (!localtime_r(&ts.tv_sec, &time_info))
+ goto fail;
+
+ len = strftime(prefix, buflen, "%H:%M:%S", &time_info);
+ if (!len)
+ goto fail;
+
+ len = dm_snprintf(prefix + len, buflen - len, ".%ld ", ts.tv_nsec/1000);
+ if (len < 0)
+ goto fail;
+
+ return;
+
+fail:
+ *prefix = '\0';
+}
+
__attribute__ ((format(printf, 5, 0)))
static void _vprint_log(int level, const char *file, int line, int dm_errno_or_class,
const char *format, va_list orig_ap)
{
va_list ap;
char buf[1024], message[4096];
+ char time_prefix[32] = "";
int bufused, n;
const char *trformat; /* Translated format string */
char *newbuf;
@@ -598,10 +627,21 @@ static void _vprint_log(int level, const char *file, int line, int
dm_errno_or_c
log_it:
if (!logged_via_report && ((verbose_level() >= level) &&
!_log_suppress)) {
if (verbose_level() > _LOG_DEBUG) {
- (void) dm_snprintf(buf, sizeof(buf), "#%s:%-5d ",
- file, line);
- } else
- buf[0] = '\0';
+ memset(buf, 0, sizeof(buf));
+
+ if (!time_prefix[0])
+ _set_time_prefix(time_prefix, sizeof(time_prefix));
+
+ (void) dm_snprintf(buf, sizeof(buf), "%s%s %s:%d",
+ time_prefix, log_command_file(), file, line);
+
+ } else {
+ memset(buf, 0, sizeof(buf));
+
+ /* without -vvvv, command[pid] is controlled by config settings */
+
+ (void) dm_snprintf(buf, sizeof(buf), "%s", log_command_info());
+ }
if (_indent)
switch (level) {
@@ -627,8 +667,7 @@ static void _vprint_log(int level, const char *file, int line, int
dm_errno_or_c
stream = (use_stderr || (level != _LOG_WARN)) ? err_stream : out_stream;
if (stream == err_stream)
fflush(out_stream);
- fprintf(stream, "%s%s%s%s", buf, log_command_name(),
- _msg_prefix, indent_spaces);
+ fprintf(stream, "%s%s%s", buf, _msg_prefix, indent_spaces);
vfprintf(stream, trformat, ap);
fputc('\n', stream);
}
@@ -643,15 +682,17 @@ static void _vprint_log(int level, const char *file, int line, int
dm_errno_or_c
}
if (_log_to_file && (_log_while_suspended || !critical_section())) {
- fprintf(_log_file, "%s:%-5d %s%s", file, line, log_command_name(),
- _msg_prefix);
+ if (!time_prefix[0])
+ _set_time_prefix(time_prefix, sizeof(time_prefix));
+
+ fprintf(_log_file, "%s%s %s:%d%s", time_prefix, log_command_file(), file,
line, _msg_prefix);
va_copy(ap, orig_ap);
vfprintf(_log_file, trformat, ap);
va_end(ap);
if (_log_file_max_lines && ++_log_file_lines >= _log_file_max_lines) {
- fprintf(_log_file, "\n%s:%-5d %sAborting. Command has reached limit "
+ fprintf(_log_file, "\n%s:%d %sAborting. Command has reached limit "
"for logged lines (LVM_LOG_FILE_MAX_LINES=" FMTu64 ").",
file, line, _msg_prefix,
_log_file_max_lines);
@@ -676,9 +717,8 @@ static void _vprint_log(int level, const char *file, int line, int
dm_errno_or_c
_already_logging = 1;
memset(&buf, ' ', sizeof(buf));
bufused = 0;
- if ((n = dm_snprintf(buf, sizeof(buf),
- "%s:%-5d %s%s", file, line, log_command_name(),
- _msg_prefix)) == -1)
+ if ((n = dm_snprintf(buf, sizeof(buf), "%s:%s %s:%d %s",
+ time_prefix, log_command_file(), file, line, _msg_prefix)) == -1)
goto done;
bufused += n; /* n does not include '\0' */
diff --git a/lib/misc/lvm-globals.c b/lib/misc/lvm-globals.c
index 9d169e7..1ddd2fb 100644
--- a/lib/misc/lvm-globals.c
+++ b/lib/misc/lvm-globals.c
@@ -34,9 +34,10 @@ static enum dev_ext_e _external_device_info_source = DEV_EXT_NONE;
static int _trust_cache = 0; /* Don't scan when incomplete VGs encountered */
static int _debug_level = 0;
static int _debug_classes_logged = 0;
-static int _log_cmd_name = 0;
static int _security_level = SECURITY_LEVEL;
-static char _cmd_name[30] = "";
+static char _log_command_info[40] = "";
+static char _log_command_file[40] = "";
+static char _cmd_name[30] = "none";
static int _mirror_in_sync = 0;
static int _dmeventd_monitor = DEFAULT_DMEVENTD_MONITOR;
/* When set, disables update of _dmeventd_monitor & _ignore_suspended_devices */
@@ -147,9 +148,34 @@ void init_ignore_lvm_mirrors(int scan)
_ignore_lvm_mirrors = scan;
}
-void init_cmd_name(int status)
+void init_log_command(int log_name, int log_pid)
{
- _log_cmd_name = status;
+ memset(_log_command_info, 0, sizeof(_log_command_info));
+ memset(_log_command_file, 0, sizeof(_log_command_file));
+
+ /*
+ * Always include command name and pid in file and verbose output.
+ */
+
+ (void) dm_snprintf(_log_command_file, sizeof(_log_command_file), "%s[%d]",
+ _cmd_name, getpid());
+
+ /*
+ * This is the prefix that can be configured for each line of stdout.
+ */
+
+ if (!log_name && !log_pid)
+ return;
+
+ else if (log_name && !log_pid)
+ (void) dm_strncpy(_log_command_info, _cmd_name, sizeof(_log_command_info));
+
+ else if (!log_name && log_pid)
+ (void) dm_snprintf(_log_command_info, sizeof(_log_command_info), "%d",
getpid());
+
+ else
+ (void) dm_snprintf(_log_command_info, sizeof(_log_command_info), "%s[%d]",
+ _cmd_name, getpid());
}
void init_is_static(unsigned value)
@@ -198,12 +224,14 @@ void set_sysfs_dir_path(const char *path)
(void) dm_strncpy(_sysfs_dir_path, path, sizeof(_sysfs_dir_path));
}
-const char *log_command_name(void)
+const char *log_command_info(void)
{
- if (!_log_cmd_name)
- return "";
+ return _log_command_info;
+}
- return _cmd_name;
+const char *log_command_file(void)
+{
+ return _log_command_file;
}
void init_error_message_produced(int value)
diff --git a/lib/misc/lvm-globals.h b/lib/misc/lvm-globals.h
index 793beca..c69b99a 100644
--- a/lib/misc/lvm-globals.h
+++ b/lib/misc/lvm-globals.h
@@ -36,6 +36,7 @@ void init_trust_cache(int trustcache);
void init_debug(int level);
void init_debug_classes_logged(int classes);
void init_cmd_name(int status);
+void init_log_command(int log_name, int log_pid);
void init_security_level(int level);
void init_mirror_in_sync(int in_sync);
void init_dmeventd_monitor(int reg);
@@ -73,7 +74,8 @@ int mirror_in_sync(void);
int background_polling(void);
int ignore_suspended_devices(void);
int ignore_lvm_mirrors(void);
-const char *log_command_name(void);
+const char *log_command_info(void);
+const char *log_command_file(void);
unsigned is_static(void);
int udev_checking(void);
const char *sysfs_dir_path(void);
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index 49a6038..b2fb00d 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -2492,7 +2492,6 @@ static void _apply_current_settings(struct cmd_context *cmd)
init_dmeventd_monitor(DEFAULT_DMEVENTD_MONITOR);
init_msg_prefix(cmd->default_settings.msg_prefix);
- init_cmd_name(cmd->default_settings.cmd_name);
archive_enable(cmd, cmd->current_settings.archive);
backup_enable(cmd, cmd->current_settings.backup);
@@ -2788,6 +2787,10 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char
**argv)
return ECMD_FAILED;
}
+ set_cmd_name(cmd->name);
+
+ init_log_command(find_config_tree_bool(cmd, log_command_names_CFG, NULL), 0);
+
configure_command_option_values(cmd->name);
/* eliminate '-' from all options starting with -- */
@@ -2855,8 +2858,6 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv)
cmd->position_argc = argc;
cmd->position_argv = argv;
- set_cmd_name(cmd->name);
-
if (arg_is_set(cmd, config_ARG))
if (!override_config_tree_from_string(cmd, arg_str_value(cmd, config_ARG,
""))) {
ret = EINVALID_CMD_LINE;