[lxc-devel] [PATCH] use a default per-container logfile
Stéphane Graber
stgraber at ubuntu.com
Tue Jan 22 23:29:55 UTC 2013
On 01/16/2013 12:02 AM, Serge Hallyn wrote:
> [ 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.hallyn at ubuntu.com>
Acked-by: Stéphane Graber <stgraber at ubuntu.com>
And pushed to staging. Thanks.
> ---
> 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;
> }
>
--
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 901 bytes
Desc: OpenPGP digital signature
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20130122/819f34e4/attachment.pgp>
More information about the lxc-devel
mailing list