[lxc-devel] [lxc/master] log: add trace feature for liblxc

0x0916 on Github lxc-bot at linuxcontainers.org
Thu May 25 07:53:34 UTC 2017


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 3881 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20170525/72ceb424/attachment.bin>
-------------- next part --------------
From 884ec13b683b16534bbd7703ccedf6411aa16959 Mon Sep 17 00:00:00 2001
From: 0x0916 <w at laoqinren.net>
Date: Thu, 25 May 2017 15:34:26 +0800
Subject: [PATCH] log: add trace feature for liblxc

When we use only `liblxc`, we have no way to get DEBUG/TRACE
information.

With this patch, we can set `LXC_TRACE=xxx`(xxx may be `trace`,`debug`,
`ifno`, `notice`, `warn` and `error` etc.). and then we can see more info
from stdout.

This is very useful for developers when they debug programs which only
use `liblxc`.

For example:

run lxc tests without `LXC_TRACE=trace`

```bash
$ ./src/tests/lxc-test-startone
all lxc_container tests passed for lxctest1
Destroyed container lxctest1
```

and run lxc tests with `LXC_TRACE=trace`

```bash
$ LXC_TRACE=trace ./src/tests/lxc-test-startone
[INFO] lxc: lsm/lsm.c: lsm_init: 62 Initialized LSM security driver AppArmor
[INFO] lxc: lsm/lsm.c: lsm_init: 62 Initialized LSM security driver AppArmor
[DEBUG] lxc: monitor.c: lxc_monitord_spawn: 330 Going to wait for pid 16607.
[DEBUG] lxc: monitor.c: lxc_monitord_spawn: 349 Trying to sync with child process.
[INFO] lxc: start.c: lxc_check_inherited: 243 Closed inherited fd: 3.
[INFO] lxc: start.c: lxc_check_inherited: 243 Closed inherited fd: 4.
[DEBUG] lxc: monitor.c: lxc_monitord_spawn: 364 Successfully synced with child process.
[DEBUG] lxc: monitor.c: lxc_monitord_spawn: 333 Finished waiting on pid 16607.
[INFO] lxc: lxccontainer.c: do_lxcapi_start: 802 Attempting to set proc title to [lxc monitor] /usr/local/var/lib/lxc lxctest1
[INFO] lxc: start.c: lxc_check_inherited: 243 Closed inherited fd: 3.
[DEBUG] lxc: monitor.c: lxc_monitord_spawn: 330 Going to wait for pid 16611.
[DEBUG] lxc: monitor.c: lxc_monitord_spawn: 349 Trying to sync with child process.
[INFO] lxc: start.c: lxc_check_inherited: 243 Closed inherited fd: 3.
[INFO] lxc: start.c: lxc_check_inherited: 243 Closed inherited fd: 4.
[DEBUG] lxc: monitor.c: lxc_monitord_spawn: 364 Successfully synced with child process.
[DEBUG] lxc: monitor.c: lxc_monitord_spawn: 333 Finished waiting on pid 16611.
[INFO] lxc: monitor.c: lxc_monitor_sock_name: 201 using monitor socket name "lxc/69d2cd1be5952f52//usr/local/var/lib/lxc" (length of socket name 43 must be <= 105)
[DEBUG] lxc: monitor.c: lxc_monitor_open: 225 opening monitor socket lxc/69d2cd1be5952f52//usr/local/var/lib/lxc with len 43
[DEBUG] lxc: commands.c: lxc_cmd_rsp_recv: 203 command get_state response data length is 0
[DEBUG] lxc: commands.c: lxc_cmd_get_state: 586 Container "lxctest1" is in "RUNNING" state.
[DEBUG] lxc: commands.c: lxc_cmd_rsp_recv: 203 command get_state response data length is 0
[DEBUG] lxc: commands.c: lxc_cmd_get_state: 586 Container "lxctest1" is in "RUNNING" state.
[DEBUG] lxc: commands.c: lxc_cmd_rsp_recv: 203 command get_state response data length is 0
[DEBUG] lxc: commands.c: lxc_cmd_get_state: 586 Container "lxctest1" is in "RUNNING" state.
[DEBUG] lxc: commands.c: lxc_cmd_rsp_recv: 203 command get_state response data length is 0
[DEBUG] lxc: commands.c: lxc_cmd_get_state: 586 Container "lxctest1" is in "RUNNING" state.
[DEBUG] lxc: commands.c: lxc_cmd_rsp_recv: 203 command get_state response data length is 0
[DEBUG] lxc: commands.c: lxc_cmd_get_state: 586 Container "lxctest1" is in "RUNNING" state.
[DEBUG] lxc: commands.c: lxc_cmd_rsp_recv: 203 command stop response data length is 0
[INFO] lxc: commands.c: lxc_cmd_stop: 632 Container "lxctest1" has stopped.
all lxc_container tests passed for lxctest1
[INFO] lxc: commands.c: lxc_cmd_stop: 617 Container "lxctest1" is already stopped.
[INFO] lxc: lsm/lsm.c: lsm_init: 62 Initialized LSM security driver AppArmor
Destroyed container lxctest1
```

Signed-off-by: 0x0916 <w at laoqinren.net>
---
 src/lxc/log.c | 41 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/src/lxc/log.c b/src/lxc/log.c
index 339b81c61..821e89596 100644
--- a/src/lxc/log.c
+++ b/src/lxc/log.c
@@ -139,6 +139,17 @@ static int log_append_stderr(const struct lxc_log_appender *appender,
 	return 0;
 }
 
+static int log_append_stdout(const struct lxc_log_appender *appender,
+			     struct lxc_log_event *event)
+{
+	fprintf(stdout, "[%s] ", lxc_log_priority_to_string(event->priority));
+	fprintf(stdout, "%s: %s%s", log_prefix, log_vmname ? log_vmname : "", log_vmname ? ": " : "");
+	fprintf(stdout, "%s: %s: %d ", event->locinfo->file, event->locinfo->func, event->locinfo->line);
+	vfprintf(stdout, event->fmt, *event->vap);
+	fprintf(stdout, "\n");
+	return 0;
+}
+
 /*---------------------------------------------------------------------------*/
 int lxc_unix_epoch_to_utc(char *buf, size_t bufsize, const struct timespec *time)
 {
@@ -310,6 +321,12 @@ static struct lxc_log_appender log_appender_syslog = {
 	.next		= NULL,
 };
 
+static struct lxc_log_appender log_appender_stdout = {
+	.name		= "stdout",
+	.append		= log_append_stdout,
+	.next		= NULL,
+};
+
 static struct lxc_log_appender log_appender_stderr = {
 	.name		= "stderr",
 	.append		= log_append_stderr,
@@ -687,3 +704,27 @@ extern void lxc_log_options_no_override()
 	lxc_quiet_specified = 1;
 	lxc_loglevel_specified = 1;
 }
+
+static int lxc_log_stdout() {
+	struct lxc_log_appender *appender;
+
+	if (!lxc_log_category_lxc.appender) {
+		lxc_log_category_lxc.appender = &log_appender_stdout;
+		return 0;
+	}
+	appender = lxc_log_category_lxc.appender;
+	while (appender->next != NULL)
+		appender = appender->next;
+	appender->next = &log_appender_stdout;
+	return 0;
+}
+
+__attribute__((constructor))
+void init_log() {
+	char *level;
+	level = getenv("LXC_TRACE");
+	if (level) {
+		lxc_log_stdout();
+		lxc_log_category_lxc.priority = lxc_log_priority_to_int(level);
+	}
+}


More information about the lxc-devel mailing list