2 * lxc: linux Container library
4 * (C) Copyright IBM Corp. 2007, 2008
7 * Cedric Le Goater <legoater@free.fr>
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 #define __STDC_FORMAT_MACROS /* Required for PRIu64 to work. */
32 #include <sys/types.h>
48 /* We're logging in seconds and nanoseconds. Assuming that the underlying
49 * datatype is currently at maximum a 64bit integer, we have a date string that
50 * is of maximum length (2^64 - 1) * 2 = (21 + 21) = 42.
52 #define LXC_LOG_TIME_SIZE ((LXC_NUMSTRLEN64)*2)
55 static int syslog_enable
= 0;
56 int lxc_quiet_specified
;
57 int lxc_log_use_global_fd
;
58 static int lxc_loglevel_specified
;
60 static char log_prefix
[LXC_LOG_PREFIX_SIZE
] = "lxc";
61 static char *log_fname
= NULL
;
62 static char *log_vmname
= NULL
;
64 lxc_log_define(lxc_log
, lxc
);
66 static int lxc_log_priority_to_syslog(int priority
)
69 case LXC_LOG_PRIORITY_FATAL
:
71 case LXC_LOG_PRIORITY_ALERT
:
73 case LXC_LOG_PRIORITY_CRIT
:
75 case LXC_LOG_PRIORITY_ERROR
:
77 case LXC_LOG_PRIORITY_WARN
:
79 case LXC_LOG_PRIORITY_NOTICE
:
80 case LXC_LOG_PRIORITY_NOTSET
:
82 case LXC_LOG_PRIORITY_INFO
:
84 case LXC_LOG_PRIORITY_TRACE
:
85 case LXC_LOG_PRIORITY_DEBUG
:
93 /*---------------------------------------------------------------------------*/
94 static int log_append_syslog(const struct lxc_log_appender
*appender
,
95 struct lxc_log_event
*event
)
104 va_copy(args
, *event
->vap
);
105 len
= vsnprintf(NULL
, 0, event
->fmt
, args
) + 1;
107 msg
= malloc(len
* sizeof(char));
110 rc
= vsnprintf(msg
, len
, event
->fmt
, *event
->vap
);
111 if (rc
== -1 || rc
>= len
) {
116 syslog(lxc_log_priority_to_syslog(event
->priority
),
117 "%s%s %s - %s:%s:%d - %s" ,
118 log_vmname
? log_vmname
: "",
119 log_vmname
? ":" : "",
121 event
->locinfo
->file
, event
->locinfo
->func
,
122 event
->locinfo
->line
,
128 /*---------------------------------------------------------------------------*/
129 static int log_append_stderr(const struct lxc_log_appender
*appender
,
130 struct lxc_log_event
*event
)
132 if (event
->priority
< LXC_LOG_PRIORITY_ERROR
)
135 fprintf(stderr
, "%s: %s%s", log_prefix
, log_vmname
? log_vmname
: "", log_vmname
? ": " : "");
136 fprintf(stderr
, "%s: %s: %d ", event
->locinfo
->file
, event
->locinfo
->func
, event
->locinfo
->line
);
137 vfprintf(stderr
, event
->fmt
, *event
->vap
);
138 fprintf(stderr
, "\n");
142 /*---------------------------------------------------------------------------*/
143 int lxc_unix_epoch_to_utc(char *buf
, size_t bufsize
, const struct timespec
*time
)
145 int64_t epoch_to_days
, z
, era
, doe
, yoe
, year
, doy
, mp
, day
, month
,
146 d_in_s
, hours
, h_in_s
, minutes
, seconds
;
147 char nanosec
[LXC_NUMSTRLEN64
];
150 /* See https://howardhinnant.github.io/date_algorithms.html for an
151 * explanation of the algorithm used here.
154 /* Convert Epoch in seconds to number of days. */
155 epoch_to_days
= time
->tv_sec
/ 86400;
157 /* Shift the Epoch from 1970-01-01 to 0000-03-01. */
158 z
= epoch_to_days
+ 719468;
160 /* compute the era from the serial date by simply dividing by the number
161 * of days in an era (146097).
163 era
= (z
>= 0 ? z
: z
- 146096) / 146097;
165 /* The day-of-era (doe) can then be found by subtracting the era number
166 * times the number of days per era, from the serial date.
168 doe
= (z
- era
* 146097);
170 /* From the day-of-era (doe), the year-of-era (yoe, range [0, 399]) can
173 yoe
= (doe
- doe
/ 1460 + doe
/ 36524 - doe
/ 146096) / 365;
175 /* Given year-of-era, and era, one can now compute the year. */
176 year
= (yoe
) + era
* 400;
178 /* Also the day-of-year, again with the year beginning on Mar. 1, can be
179 * computed from the day-of-era and year-of-era.
181 doy
= doe
- (365 * yoe
+ yoe
/ 4 - yoe
/ 100);
183 /* Given day-of-year, find the month number. */
184 mp
= (5 * doy
+ 2) / 153;
186 /* From day-of-year and month-of-year we can now easily compute
189 day
= doy
- (153 * mp
+ 2) / 5 + 1;
191 /* Transform the month number from the [0, 11] / [Mar, Feb] system to
192 * the civil system: [1, 12] to find the correct month.
194 month
= mp
+ (mp
< 10 ? 3 : -9);
196 /* Transform days in the epoch to seconds. */
197 d_in_s
= epoch_to_days
* 86400;
199 /* To find the current hour simply substract the Epoch_to_days from the
200 * total Epoch and divide by the number of seconds in an hour.
202 hours
= (time
->tv_sec
- d_in_s
) / 3600;
204 /* Transform hours to seconds. */
205 h_in_s
= hours
* 3600;
207 /* Calculate minutes by substracting the seconds for all days in the
208 * epoch and for all hours in the epoch and divide by the number of
209 * minutes in an hour.
211 minutes
= (time
->tv_sec
- d_in_s
- h_in_s
) / 60;
213 /* Calculate the seconds by substracting the seconds for all days in the
214 * epoch, hours in the epoch and minutes in the epoch.
216 seconds
= (time
->tv_sec
- d_in_s
- h_in_s
- (minutes
* 60));
218 /* Make string from nanoseconds. */
219 ret
= snprintf(nanosec
, LXC_NUMSTRLEN64
, "%ld", time
->tv_nsec
);
220 if (ret
< 0 || ret
>= LXC_NUMSTRLEN64
)
223 /* Create final timestamp for the log and shorten nanoseconds to 3
226 ret
= snprintf(buf
, bufsize
,
227 "%" PRId64
"%02" PRId64
"%02" PRId64
"%02" PRId64
228 "%02" PRId64
"%02" PRId64
".%.3s",
229 year
, month
, day
, hours
, minutes
, seconds
, nanosec
);
230 if (ret
< 0 || (size_t)ret
>= bufsize
)
236 /* This function needs to make extra sure that it is thread-safe. We had some
237 * problems with that before. This especially involves time-conversion
238 * functions. I don't want to find any localtime() or gmtime() functions or
239 * relatives in here. Not even localtime_r() or gmtime_r() or relatives. They
240 * all fiddle with global variables and locking in various libcs. They cause
241 * deadlocks when liblxc is used multi-threaded and no matter how smart you
242 * think you are, you __will__ cause trouble using them.
243 * (As a short example how this can cause trouble: LXD uses forkstart to fork
244 * off a new process that runs the container. At the same time the go runtime
245 * LXD relies on does its own multi-threading thing which we can't controll. The
246 * fork()ing + threading then seems to mess with the locking states in these
247 * time functions causing deadlocks.)
248 * The current solution is to be good old unix people and use the Epoch as our
249 * reference point and simply use the seconds and nanoseconds that have past
250 * since then. This relies on clock_gettime() which is explicitly marked MT-Safe
251 * with no restrictions! This way, anyone who is really strongly invested in
252 * getting the actual time the log entry was created, can just convert it for
253 * themselves. Our logging is mostly done for debugging purposes so don't try
254 * to make it pretty. Pretty might cost you thread-safety.
256 static int log_append_logfile(const struct lxc_log_appender
*appender
,
257 struct lxc_log_event
*event
)
259 char buffer
[LXC_LOG_BUFFER_SIZE
];
260 char date_time
[LXC_LOG_TIME_SIZE
];
265 if (!lxc_log_use_global_fd
&& current_config
)
266 fd_to_use
= current_config
->logfd
;
270 fd_to_use
= lxc_log_fd
;
275 if (lxc_unix_epoch_to_utc(date_time
, LXC_LOG_TIME_SIZE
, &event
->timestamp
) < 0)
278 n
= snprintf(buffer
, sizeof(buffer
),
279 "%15s%s%s %s %-8s %s - %s:%s:%d - ",
281 log_vmname
? " " : "",
282 log_vmname
? log_vmname
: "",
284 lxc_log_priority_to_string(event
->priority
),
286 event
->locinfo
->file
, event
->locinfo
->func
,
287 event
->locinfo
->line
);
292 if ((size_t)n
< (sizeof(buffer
) - 1))
293 n
+= vsnprintf(buffer
+ n
, sizeof(buffer
) - n
, event
->fmt
, *event
->vap
);
295 n
= sizeof(buffer
) - 1;
299 return write(fd_to_use
, buffer
, n
+ 1);
302 static struct lxc_log_appender log_appender_syslog
= {
304 .append
= log_append_syslog
,
308 static struct lxc_log_appender log_appender_stderr
= {
310 .append
= log_append_stderr
,
314 static struct lxc_log_appender log_appender_logfile
= {
316 .append
= log_append_logfile
,
320 static struct lxc_log_category log_root
= {
322 .priority
= LXC_LOG_PRIORITY_ERROR
,
327 struct lxc_log_category lxc_log_category_lxc
= {
329 .priority
= LXC_LOG_PRIORITY_ERROR
,
330 .appender
= &log_appender_logfile
,
334 /*---------------------------------------------------------------------------*/
335 static int build_dir(const char *name
)
337 char *n
= strdup(name
); // because we'll be modifying it
342 ERROR("Out of memory while creating directory '%s'.", name
);
347 for (p
= n
+1; p
< e
; p
++) {
351 if (access(n
, F_OK
)) {
352 ret
= lxc_unpriv(mkdir(n
, 0755));
353 if (ret
&& errno
!= EEXIST
) {
354 SYSERROR("failed to create directory '%s'.", n
);
365 /*---------------------------------------------------------------------------*/
366 static int log_open(const char *name
)
371 fd
= lxc_unpriv(open(name
, O_CREAT
| O_WRONLY
|
372 O_APPEND
| O_CLOEXEC
, 0666));
374 ERROR("failed to open log file \"%s\" : %s", name
,
382 newfd
= fcntl(fd
, F_DUPFD_CLOEXEC
, 3);
384 ERROR("failed to dup log fd %d : %s", fd
, strerror(errno
));
391 * Build the path to the log file
392 * @name : the name of the container
393 * @lxcpath : the lxcpath to use as a basename or NULL to use LOGPATH
394 * Returns malloced path on success, or NULL on failure
396 static char *build_log_path(const char *name
, const char *lxcpath
)
399 int len
, ret
, use_dir
;
404 #if USE_CONFIGPATH_LOGS
411 * If USE_CONFIGPATH_LOGS is true or lxcpath is given, the resulting
413 * '$logpath' + '/' + '$name' + '/' + '$name' + '.log' + '\0'
415 * If USE_CONFIGPATH_LOGS is false the resulting path will be:
416 * '$logpath' + '/' + '$name' + '.log' + '\0'
418 len
= strlen(name
) + 6; /* 6 == '/' + '.log' + '\0' */
425 len
+= strlen(lxcpath
) + 1 + strlen(name
) + 1; /* add "/$container_name/" */
427 len
+= strlen(lxcpath
) + 1;
433 ret
= snprintf(p
, len
, "%s/%s/%s.log", lxcpath
, name
, name
);
435 ret
= snprintf(p
, len
, "%s/%s.log", lxcpath
, name
);
437 if (ret
< 0 || ret
>= len
) {
444 extern void lxc_log_close(void)
449 if (lxc_log_fd
== -1)
458 * This can be called:
459 * 1. when a program calls lxc_log_init with no logfile parameter (in which
460 * case the default is used). In this case lxc.logfile can override this.
461 * 2. when a program calls lxc_log_init with a logfile parameter. In this
462 * case we don't want lxc.logfile to override this.
463 * 3. When a lxc.logfile entry is found in config file.
465 static int __lxc_log_set_file(const char *fname
, int create_dirs
)
467 if (lxc_log_fd
!= -1) {
468 // we are overriding the default.
475 if (strlen(fname
) == 0) {
480 #if USE_CONFIGPATH_LOGS
481 // we don't build_dir for the default if the default is
482 // i.e. /var/lib/lxc/$container/$container.log
485 if (build_dir(fname
)) {
486 ERROR("failed to create dir for log file \"%s\" : %s", fname
,
491 lxc_log_fd
= log_open(fname
);
492 if (lxc_log_fd
== -1)
495 log_fname
= strdup(fname
);
499 static int _lxc_log_set_file(const char *name
, const char *lxcpath
, int create_dirs
)
504 logfile
= build_log_path(name
, lxcpath
);
506 ERROR("could not build log path");
509 ret
= __lxc_log_set_file(logfile
, create_dirs
);
514 extern int lxc_log_syslog(int facility
)
516 struct lxc_log_appender
*appender
;
518 openlog(log_prefix
, LOG_PID
, facility
);
519 if (!lxc_log_category_lxc
.appender
) {
520 lxc_log_category_lxc
.appender
= &log_appender_syslog
;
523 appender
= lxc_log_category_lxc
.appender
;
524 while (appender
->next
!= NULL
)
525 appender
= appender
->next
;
526 appender
->next
= &log_appender_syslog
;
531 extern void lxc_log_enable_syslog(void)
538 * Called from lxc front-end programs (like lxc-create, lxc-start) to
539 * initalize the log defaults.
541 extern int lxc_log_init(const char *name
, const char *file
,
542 const char *priority
, const char *prefix
, int quiet
,
545 int lxc_priority
= LXC_LOG_PRIORITY_ERROR
;
548 if (lxc_log_fd
!= -1) {
549 WARN("lxc_log_init called with log already initialized");
554 lxc_priority
= lxc_log_priority_to_int(priority
);
556 if (!lxc_loglevel_specified
) {
557 lxc_log_category_lxc
.priority
= lxc_priority
;
558 lxc_loglevel_specified
= 1;
561 if (!lxc_quiet_specified
) {
563 lxc_log_category_lxc
.appender
->next
= &log_appender_stderr
;
567 lxc_log_set_prefix(prefix
);
570 log_vmname
= strdup(name
);
573 if (strcmp(file
, "none") == 0)
575 ret
= __lxc_log_set_file(file
, 1);
576 lxc_log_use_global_fd
= 1;
578 /* if no name was specified, there nothing to do */
587 /* try LOGPATH if lxcpath is the default for the privileged containers */
588 if (!geteuid() && strcmp(LXCPATH
, lxcpath
) == 0)
589 ret
= _lxc_log_set_file(name
, NULL
, 0);
593 ret
= _lxc_log_set_file(name
, lxcpath
, 1);
595 /* try LOGPATH in case its writable by the caller */
597 ret
= _lxc_log_set_file(name
, NULL
, 0);
601 * If !file, that is, if the user did not request this logpath, then
602 * ignore failures and continue logging to console
604 if (!file
&& ret
!= 0) {
605 INFO("Ignoring failure to open default logfile.");
613 * This is called when we read a lxc.loglevel entry in a lxc.conf file. This
614 * happens after processing command line arguments, which override the .conf
615 * settings. So only set the level if previously unset.
617 extern int lxc_log_set_level(int *dest
, int level
)
619 if (level
< 0 || level
>= LXC_LOG_PRIORITY_NOTSET
) {
620 ERROR("invalid log priority %d", level
);
627 extern int lxc_log_get_level(void)
629 return lxc_log_category_lxc
.priority
;
632 extern bool lxc_log_has_valid_level(void)
634 int log_level
= lxc_log_get_level();
635 if (log_level
< 0 || log_level
>= LXC_LOG_PRIORITY_NOTSET
)
641 * This is called when we read a lxc.logfile entry in a lxc.conf file. This
642 * happens after processing command line arguments, which override the .conf
643 * settings. So only set the file if previously unset.
645 extern int lxc_log_set_file(int *fd
, const char *fname
)
652 if (build_dir(fname
)) {
653 ERROR("failed to create dir for log file \"%s\" : %s", fname
,
658 *fd
= log_open(fname
);
664 extern const char *lxc_log_get_file(void)
669 extern void lxc_log_set_prefix(const char *prefix
)
671 strncpy(log_prefix
, prefix
, sizeof(log_prefix
));
672 log_prefix
[sizeof(log_prefix
) - 1] = 0;
675 extern const char *lxc_log_get_prefix(void)
680 extern void lxc_log_options_no_override()
682 lxc_quiet_specified
= 1;
683 lxc_loglevel_specified
= 1;