[ Thanks to Stéphane and Dwight for the feedback on the previous patch ] Until now, if a lxc-* (i.e. lxc-start) command did not specify a logfile (with -o logfile), the default was effectively 'none'. With this patch, the default becomes $LOGPATH/<container>/<container>.log. LOGPATH is specified at configure time with '--with-log-path='. If unspecified, it is $LXCPATH, so that logs for container r2 will show up at /var/lib/lxc/r2/r2/log. LOGPATH must exist, while lxc will make sure to create $LOGPATH/<name>. As another example, Ubuntu will likely specify --with-log-path=/var/log/lxc (and place /var/log/lxc into debian/lxc.dirs), placing r2's logs in /var/log/lxc/r2/r2.log.
If a container config file specifies 'lxc.logfile', that will override the default. If a '-o logfile' argument is specifed at lxc-start, then that will override both the default and the configuration file entry. Finally, '-o none' can be used to avoid having a logfile at all (in other words, the previous default), and that will override a lxc.logfile entry in the container configuration file. Signed-off-by: Serge Hallyn <serge.hal...@ubuntu.com> --- configure.ac | 8 +++++ src/lxc/Makefile.am | 3 +- src/lxc/confile.c | 5 --- src/lxc/log.c | 82 +++++++++++++++++++++++++++++++++++++++++------- src/lxc/log.h | 4 +-- src/lxc/lxc_attach.c | 2 +- src/lxc/lxc_cgroup.c | 2 +- src/lxc/lxc_checkpoint.c | 2 +- src/lxc/lxc_console.c | 2 +- src/lxc/lxc_execute.c | 2 +- src/lxc/lxc_freeze.c | 2 +- src/lxc/lxc_info.c | 2 +- src/lxc/lxc_init.c | 2 +- src/lxc/lxc_kill.c | 2 +- src/lxc/lxc_monitor.c | 2 +- src/lxc/lxc_restart.c | 2 +- src/lxc/lxc_start.c | 2 +- src/lxc/lxc_stop.c | 2 +- src/lxc/lxc_unfreeze.c | 2 +- src/lxc/lxc_wait.c | 2 +- src/lxc/lxccontainer.c | 2 +- 21 files changed, 99 insertions(+), 35 deletions(-) diff --git a/configure.ac b/configure.ac index d1f5ad9..6888701 100644 --- a/configure.ac +++ b/configure.ac @@ -157,6 +157,13 @@ AC_ARG_WITH([rootfs-path], [lxc rootfs mount point] )], [], [with_rootfs_path=['${libdir}/lxc/rootfs']]) +# Container log path. By default, use $lxcpath. +AC_ARG_WITH([log-path], + [AC_HELP_STRING( + [--with-log-path=dir], + [per container log path] + )], [], [with_log_path=['${with_config_path}']]) + # Expand some useful variables AS_AC_EXPAND(PREFIX, "$prefix") AS_AC_EXPAND(LIBDIR, "$libdir") @@ -173,6 +180,7 @@ AS_AC_EXPAND(LXCPATH, "$with_config_path") AS_AC_EXPAND(LXCROOTFSMOUNT, "$with_rootfs_path") AS_AC_EXPAND(LXCTEMPLATEDIR, "$datadir/lxc/templates") AS_AC_EXPAND(LXCINITDIR, "$libexecdir") +AS_AC_EXPAND(LOGPATH, "$with_log_path") # Check for some standard kernel headers AC_CHECK_HEADERS([linux/unistd.h linux/netlink.h linux/genetlink.h], diff --git a/src/lxc/Makefile.am b/src/lxc/Makefile.am index 5a28af4..8b40926 100644 --- a/src/lxc/Makefile.am +++ b/src/lxc/Makefile.am @@ -89,7 +89,8 @@ AM_CFLAGS=-I$(top_srcdir)/src \ -DLXCROOTFSMOUNT=\"$(LXCROOTFSMOUNT)\" \ -DLXCPATH=\"$(LXCPATH)\" \ -DLXCINITDIR=\"$(LXCINITDIR)\" \ - -DLXCTEMPLATEDIR=\"$(LXCTEMPLATEDIR)\" + -DLXCTEMPLATEDIR=\"$(LXCTEMPLATEDIR)\" \ + -DLOGPATH=\"$(LOGPATH)\" if ENABLE_APPARMOR AM_CFLAGS += -DHAVE_APPARMOR diff --git a/src/lxc/confile.c b/src/lxc/confile.c index 67a989e..d350f01 100644 --- a/src/lxc/confile.c +++ b/src/lxc/confile.c @@ -927,11 +927,6 @@ static int config_aa_profile(const char *key, const char *value, static int config_logfile(const char *key, const char *value, struct lxc_conf *lxc_conf) { - if (lxc_log_get_file()) { - DEBUG("Log file already specified - ignoring new value"); - return 0; - } - return lxc_log_set_file(value); } diff --git a/src/lxc/log.c b/src/lxc/log.c index d2a90de..db5c52f 100644 --- a/src/lxc/log.c +++ b/src/lxc/log.c @@ -42,6 +42,8 @@ int lxc_log_fd = -1; static char log_prefix[LXC_LOG_PREFIX_SIZE] = "lxc"; static int lxc_loglevel_specified = 0; +// if logfile was specifed on command line, it won't be overridden by lxc.logfile +static int lxc_log_specified = 0; lxc_log_define(lxc_log, lxc); @@ -148,11 +150,42 @@ static int log_open(const char *name) return newfd; } +static char *build_log_path(const char *name) +{ + char *p; + int len, ret; + + /* '$logpath' + '/' + '$name' + '/' + '$name' + '.log' + '\0' */ + len = sizeof(LOGPATH) + 2*sizeof(name) + 7; + p = malloc(len); + if (!p) + return p; + ret = snprintf(p, len, "%s/%s", LOGPATH, name); + if (ret < 0 || ret >= len) { + free(p); + return NULL; + } + ret = mkdir(p, 0755); + if (ret == -1 && errno != EEXIST) { + free(p); + return NULL; + } + ret = snprintf(p, len, "%s/%s/%s.log", LOGPATH, name, name); + if (ret < 0 || ret >= len) { + free(p); + return NULL; + } + return p; +} + /*---------------------------------------------------------------------------*/ -extern int lxc_log_init(const char *file, const char *priority, - const char *prefix, int quiet) +extern int lxc_log_init(const char *name, const char *file, + const char *priority, const char *prefix, int quiet) { int lxc_priority = LXC_LOG_PRIORITY_ERROR; + int ret; + char *tmpfile = NULL; + int want_lxc_log_specified = 0; if (lxc_log_fd != -1) return 0; @@ -176,10 +209,30 @@ extern int lxc_log_init(const char *file, const char *priority, if (prefix) lxc_log_setprefix(prefix); - if (file) - return lxc_log_set_file(file); + if (file && strcmp(file, "none") == 0) { + want_lxc_log_specified = 1; + return 0; + } - return 0; + if (!file) { + tmpfile = build_log_path(name); + if (!tmpfile) { + ERROR("could not build log path"); + return -1; + } + } else { + want_lxc_log_specified = 1; + } + + ret = lxc_log_set_file(tmpfile ? tmpfile : file); + + if (want_lxc_log_specified) + lxc_log_specified = 1; + + if (tmpfile) + free(tmpfile); + + return ret; } /* @@ -202,16 +255,23 @@ extern int lxc_log_set_level(int level) char *log_fname; // default to NULL, set in lxc_log_set_file. /* - * This is called when we read a lxc.logfile entry in a lxc.conf file. This - * happens after processing command line arguments, which override the .conf - * settings. So only set the logfile if previously unset. + * This can be called: + * 1. when a program calls lxc_log_init with no logfile parameter (in which + * case the default is used). In this case lxc.logfile can override this. + * 2. when a program calls lxc_log_init with a logfile parameter. In this + * case we don't want lxc.logfile to override this. + * 3. When a lxc.logfile entry is found in config file. */ extern int lxc_log_set_file(const char *fname) { + if (lxc_log_specified) { + INFO("lxc.logfile overriden by command line"); + return 0; + } if (lxc_log_fd != -1) { - // this should've been caught at config_logfile. - ERROR("Race in setting logfile?"); - return -1; + // we are overriding the default. + close(lxc_log_fd); + free(log_fname); } lxc_log_fd = log_open(fname); diff --git a/src/lxc/log.h b/src/lxc/log.h index a9260f2..7719958 100644 --- a/src/lxc/log.h +++ b/src/lxc/log.h @@ -287,8 +287,8 @@ extern struct lxc_log_category lxc_log_category_lxc; extern int lxc_log_fd; -extern int lxc_log_init(const char *file, const char *priority, - const char *prefix, int quiet); +extern int lxc_log_init(const char *name, const char *file, + const char *priority, const char *prefix, int quiet); extern void lxc_log_setprefix(const char *a_prefix); extern int lxc_log_set_level(int level); diff --git a/src/lxc/lxc_attach.c b/src/lxc/lxc_attach.c index 851a37a..437a400 100644 --- a/src/lxc/lxc_attach.c +++ b/src/lxc/lxc_attach.c @@ -139,7 +139,7 @@ int main(int argc, char *argv[]) if (ret) return ret; - ret = lxc_log_init(my_args.log_file, my_args.log_priority, + ret = lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority, my_args.progname, my_args.quiet); if (ret) return ret; diff --git a/src/lxc/lxc_cgroup.c b/src/lxc/lxc_cgroup.c index 97769a5..970391b 100644 --- a/src/lxc/lxc_cgroup.c +++ b/src/lxc/lxc_cgroup.c @@ -68,7 +68,7 @@ int main(int argc, char *argv[]) if (lxc_arguments_parse(&my_args, argc, argv)) return -1; - if (lxc_log_init(my_args.log_file, my_args.log_priority, + if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority, my_args.progname, my_args.quiet)) return -1; diff --git a/src/lxc/lxc_checkpoint.c b/src/lxc/lxc_checkpoint.c index 76f6709..a151750 100644 --- a/src/lxc/lxc_checkpoint.c +++ b/src/lxc/lxc_checkpoint.c @@ -115,7 +115,7 @@ int main(int argc, char *argv[]) if (ret) return ret; - ret = lxc_log_init(my_args.log_file, my_args.log_priority, + ret = lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority, my_args.progname, my_args.quiet); if (ret) return ret; diff --git a/src/lxc/lxc_console.c b/src/lxc/lxc_console.c index d09c688..c263d0f 100644 --- a/src/lxc/lxc_console.c +++ b/src/lxc/lxc_console.c @@ -187,7 +187,7 @@ int main(int argc, char *argv[]) if (err) return -1; - err = lxc_log_init(my_args.log_file, my_args.log_priority, + err = lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority, my_args.progname, my_args.quiet); if (err) return -1; diff --git a/src/lxc/lxc_execute.c b/src/lxc/lxc_execute.c index 1eb25a7..9377f4f 100644 --- a/src/lxc/lxc_execute.c +++ b/src/lxc/lxc_execute.c @@ -99,7 +99,7 @@ int main(int argc, char *argv[]) if (lxc_arguments_parse(&my_args, argc, argv)) return -1; - if (lxc_log_init(my_args.log_file, my_args.log_priority, + if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority, my_args.progname, my_args.quiet)) return -1; diff --git a/src/lxc/lxc_freeze.c b/src/lxc/lxc_freeze.c index 770d923..4da5654 100644 --- a/src/lxc/lxc_freeze.c +++ b/src/lxc/lxc_freeze.c @@ -54,7 +54,7 @@ int main(int argc, char *argv[]) if (lxc_arguments_parse(&my_args, argc, argv)) return -1; - if (lxc_log_init(my_args.log_file, my_args.log_priority, + if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority, my_args.progname, my_args.quiet)) return -1; diff --git a/src/lxc/lxc_info.c b/src/lxc/lxc_info.c index 1a1cc22..48c1370 100644 --- a/src/lxc/lxc_info.c +++ b/src/lxc/lxc_info.c @@ -79,7 +79,7 @@ int main(int argc, char *argv[]) if (ret) return 1; - if (lxc_log_init(my_args.log_file, my_args.log_priority, + if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority, my_args.progname, my_args.quiet)) return 1; diff --git a/src/lxc/lxc_init.c b/src/lxc/lxc_init.c index 2263cd1..90e1ad6 100644 --- a/src/lxc/lxc_init.c +++ b/src/lxc/lxc_init.c @@ -79,7 +79,7 @@ int main(int argc, char *argv[]) if (lxc_caps_init()) exit(err); - if (lxc_log_init(NULL, 0, basename(argv[0]), quiet)) + if (lxc_log_init(NULL, "none", 0, basename(argv[0]), quiet)) exit(err); if (!argv[optind]) { diff --git a/src/lxc/lxc_kill.c b/src/lxc/lxc_kill.c index 3d996a5..f9bfe34 100644 --- a/src/lxc/lxc_kill.c +++ b/src/lxc/lxc_kill.c @@ -61,7 +61,7 @@ int main(int argc, char *argv[], char *envp[]) if (ret) return ret; - ret = lxc_log_init(my_args.log_file, my_args.log_priority, + ret = lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority, my_args.progname, my_args.quiet); if (ret) return ret; diff --git a/src/lxc/lxc_monitor.c b/src/lxc/lxc_monitor.c index 4bd6ab0..2b8b0a0 100644 --- a/src/lxc/lxc_monitor.c +++ b/src/lxc/lxc_monitor.c @@ -65,7 +65,7 @@ int main(int argc, char *argv[]) if (lxc_arguments_parse(&my_args, argc, argv)) return -1; - if (lxc_log_init(my_args.log_file, my_args.log_priority, + if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority, my_args.progname, my_args.quiet)) return -1; diff --git a/src/lxc/lxc_restart.c b/src/lxc/lxc_restart.c index 7548682..1cf9462 100644 --- a/src/lxc/lxc_restart.c +++ b/src/lxc/lxc_restart.c @@ -122,7 +122,7 @@ int main(int argc, char *argv[]) if (lxc_arguments_parse(&my_args, argc, argv)) return -1; - if (lxc_log_init(my_args.log_file, my_args.log_priority, + if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority, my_args.progname, my_args.quiet)) return -1; diff --git a/src/lxc/lxc_start.c b/src/lxc/lxc_start.c index a97dcca..b64acff 100644 --- a/src/lxc/lxc_start.c +++ b/src/lxc/lxc_start.c @@ -164,7 +164,7 @@ int main(int argc, char *argv[]) else args = my_args.argv; - if (lxc_log_init(my_args.log_file, my_args.log_priority, + if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority, my_args.progname, my_args.quiet)) return err; diff --git a/src/lxc/lxc_stop.c b/src/lxc/lxc_stop.c index 639b750..749d78a 100644 --- a/src/lxc/lxc_stop.c +++ b/src/lxc/lxc_stop.c @@ -53,7 +53,7 @@ int main(int argc, char *argv[]) if (lxc_arguments_parse(&my_args, argc, argv)) return -1; - if (lxc_log_init(my_args.log_file, my_args.log_priority, + if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority, my_args.progname, my_args.quiet)) return -1; diff --git a/src/lxc/lxc_unfreeze.c b/src/lxc/lxc_unfreeze.c index 22be839..02e9a47 100644 --- a/src/lxc/lxc_unfreeze.c +++ b/src/lxc/lxc_unfreeze.c @@ -53,7 +53,7 @@ int main(int argc, char *argv[]) if (lxc_arguments_parse(&my_args, argc, argv)) return -1; - if (lxc_log_init(my_args.log_file, my_args.log_priority, + if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority, my_args.progname, my_args.quiet)) return -1; diff --git a/src/lxc/lxc_wait.c b/src/lxc/lxc_wait.c index 799225d..b0643c7 100644 --- a/src/lxc/lxc_wait.c +++ b/src/lxc/lxc_wait.c @@ -83,7 +83,7 @@ int main(int argc, char *argv[]) if (lxc_arguments_parse(&my_args, argc, argv)) return -1; - if (lxc_log_init(my_args.log_file, my_args.log_priority, + if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority, my_args.progname, my_args.quiet)) return -1; diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 5919d2c..502a7a7 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -976,7 +976,7 @@ struct lxc_container *lxc_container_new(const char *name) c->set_cgroup_item = lxcapi_set_cgroup_item; /* we'll allow the caller to update these later */ - if (lxc_log_init(NULL, NULL, "lxc_container", 0)) { + if (lxc_log_init(NULL, "none", NULL, "lxc_container", 0)) { fprintf(stderr, "failed to open log\n"); goto err; } -- 1.8.0 ------------------------------------------------------------------------------ Master Java SE, Java EE, Eclipse, Spring, Hibernate, JavaScript, jQuery and much more. Keep your Java skills current with LearnJavaNow - 200+ hours of step-by-step video tutorials by Java experts. SALE $49.99 this month only -- learn more at: http://p.sf.net/sfu/learnmore_122612 _______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel