Commit fc7bedc5 authored by Andrey Vagin's avatar Andrey Vagin Committed by Pavel Emelyanov

crtools: make to be able to split messages by pid

If the option --log-pid is set, each process will have an own log file.
Otherwise PID is added to each log message.

A message can't be bigger than one page minus some bytes for pid.
Signed-off-by: 's avatarAndrey Vagin <avagin@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent ad7c18a1
...@@ -605,6 +605,10 @@ static int restore_task_with_children(void *_arg) ...@@ -605,6 +605,10 @@ static int restore_task_with_children(void *_arg)
exit(-1); exit(-1);
} }
ret = log_init_by_pid();
if (ret < 0)
exit(1);
list_for_each_entry(me, &tasks, list) list_for_each_entry(me, &tasks, list)
if (me->pid == pid) if (me->pid == pid)
break; break;
......
...@@ -395,6 +395,7 @@ int main(int argc, char *argv[]) ...@@ -395,6 +395,7 @@ int main(int argc, char *argv[])
{ "help", no_argument, 0, 'h' }, { "help", no_argument, 0, 'h' },
{ SK_EST_PARAM, no_argument, 0, 42 }, { SK_EST_PARAM, no_argument, 0, 42 },
{ "close", required_argument, 0, 43 }, { "close", required_argument, 0, 43 },
{ "log-pid", no_argument, 0, 44},
{ }, { },
}; };
...@@ -434,6 +435,7 @@ int main(int argc, char *argv[]) ...@@ -434,6 +435,7 @@ int main(int argc, char *argv[])
} }
break; break;
case 'o': case 'o':
opts.output = strdup(optarg);
if (log_init(optarg)) if (log_init(optarg))
return -1; return -1;
log_inited = 1; log_inited = 1;
...@@ -470,6 +472,9 @@ int main(int argc, char *argv[]) ...@@ -470,6 +472,9 @@ int main(int argc, char *argv[])
close(fd); close(fd);
break; break;
} }
case 44:
opts.log_file_per_pid = 1;
break;
case 'h': case 'h':
default: default:
goto usage; goto usage;
...@@ -553,7 +558,9 @@ usage: ...@@ -553,7 +558,9 @@ usage:
pr_msg(" --%s checkpoint/restore established TCP connections\n", SK_EST_PARAM); pr_msg(" --%s checkpoint/restore established TCP connections\n", SK_EST_PARAM);
pr_msg("\n* Logging:\n"); pr_msg("\n* Logging:\n");
pr_msg(" -o|--log-file log file name (relative path is relative to --images-dir)\n"); pr_msg(" -o|--log-file [NAME] log file name (relative path is relative to --images-dir)\n");
pr_msg(" --log-pid if the -o option is in effect, each restored processes is\n");
pr_msg(" written to the [NAME].pid file\n");
pr_msg(" -v [num] set logging level\n"); pr_msg(" -v [num] set logging level\n");
pr_msg(" 0 - silent (only error messages)\n"); pr_msg(" 0 - silent (only error messages)\n");
pr_msg(" 1 - informative (default)\n"); pr_msg(" 1 - informative (default)\n");
......
...@@ -74,6 +74,8 @@ struct cr_options { ...@@ -74,6 +74,8 @@ struct cr_options {
bool ext_unix_sk; bool ext_unix_sk;
bool tcp_established_ok; bool tcp_established_ok;
unsigned int namespaces_flags; unsigned int namespaces_flags;
bool log_file_per_pid;
char *output;
}; };
extern struct cr_options opts; extern struct cr_options opts;
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
extern int log_init(const char *output); extern int log_init(const char *output);
extern void log_fini(void); extern void log_fini(void);
extern int log_init_by_pid(void);
extern int log_get_fd(void); extern int log_get_fd(void);
......
...@@ -23,6 +23,9 @@ ...@@ -23,6 +23,9 @@
static unsigned int current_loglevel = DEFAULT_LOGLEVEL; static unsigned int current_loglevel = DEFAULT_LOGLEVEL;
static int current_logfd = DEFAULT_LOGFD; static int current_logfd = DEFAULT_LOGFD;
static char buffer[PAGE_SIZE];
static char buf_off = 0;
int log_get_fd(void) int log_get_fd(void)
{ {
return current_logfd; return current_logfd;
...@@ -67,6 +70,23 @@ err: ...@@ -67,6 +70,23 @@ err:
return -1; return -1;
} }
int log_init_by_pid(void)
{
char path[PATH_MAX];
if (!opts.log_file_per_pid) {
buf_off = snprintf(buffer, PAGE_SIZE, "%6d: ", getpid());
return 0;
}
if (!opts.output)
return 0;
snprintf(path, PATH_MAX, "%s.%d", opts.output, getpid());
return log_init(path);
}
void log_fini(void) void log_fini(void)
{ {
if (current_logfd > 2) if (current_logfd > 2)
...@@ -86,7 +106,7 @@ void log_set_loglevel(unsigned int level) ...@@ -86,7 +106,7 @@ void log_set_loglevel(unsigned int level)
void print_on_level(unsigned int loglevel, const char *format, ...) void print_on_level(unsigned int loglevel, const char *format, ...)
{ {
va_list params; va_list params;
int fd; int fd, size, ret, off;
if (unlikely(loglevel == LOG_MSG)) { if (unlikely(loglevel == LOG_MSG)) {
fd = STDOUT_FILENO; fd = STDOUT_FILENO;
...@@ -97,6 +117,16 @@ void print_on_level(unsigned int loglevel, const char *format, ...) ...@@ -97,6 +117,16 @@ void print_on_level(unsigned int loglevel, const char *format, ...)
} }
va_start(params, format); va_start(params, format);
vdprintf(fd, format, params); size = vsnprintf(buffer + buf_off, PAGE_SIZE - buf_off, format, params);
va_end(params); va_end(params);
size += buf_off;
off = 0;
while (off < size) {
ret = write(fd, buffer + off, size - off);
if (ret <= 0)
break;
off += ret;
}
} }
...@@ -113,7 +113,7 @@ run_test() ...@@ -113,7 +113,7 @@ run_test()
done done
echo Restore $pid echo Restore $pid
setsid $CRTOOLS restore -D $ddump -o restore.log -v 4 -d -t $pid $args || return 2 setsid $CRTOOLS restore --log-pid -D $ddump -o restore.log -v 4 -d -t $pid $args || return 2
save_fds $pid $ddump/restore.fd save_fds $pid $ddump/restore.fd
diff_fds $ddump/dump.fd $ddump/restore.fd || return 2 diff_fds $ddump/dump.fd $ddump/restore.fd || return 2
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment