[ovs-dev] [worker 09/12] vlog: Use system calls instead of stdio to write log files.
Ethan Jackson
ethan at nicira.com
Wed Jun 27 01:23:28 UTC 2012
Looks good, thanks.
Ethan
On Tue, May 22, 2012 at 5:19 PM, Ben Pfaff <blp at nicira.com> wrote:
> This will be easier to deal with in an upcoming commit that will use a
> subprocess to do asynchronous log I/O.
>
> Signed-off-by: Ben Pfaff <blp at nicira.com>
> ---
> lib/vlog.c | 24 ++++++++++++------------
> 1 files changed, 12 insertions(+), 12 deletions(-)
>
> diff --git a/lib/vlog.c b/lib/vlog.c
> index fdc1b17..f7030b9 100644
> --- a/lib/vlog.c
> +++ b/lib/vlog.c
> @@ -19,6 +19,7 @@
> #include <assert.h>
> #include <ctype.h>
> #include <errno.h>
> +#include <fcntl.h>
> #include <stdarg.h>
> #include <stdlib.h>
> #include <string.h>
> @@ -84,7 +85,7 @@ static struct facility facilities[VLF_N_FACILITIES] = {
>
> /* VLF_FILE configuration. */
> static char *log_file_name;
> -static FILE *log_file;
> +static int log_fd = -1;
>
> /* vlog initialized? */
> static bool vlog_inited;
> @@ -186,7 +187,7 @@ update_min_level(struct vlog_module *module)
>
> module->min_level = VLL_OFF;
> for (facility = 0; facility < VLF_N_FACILITIES; facility++) {
> - if (log_file || facility != VLF_FILE) {
> + if (log_fd >= 0 || facility != VLF_FILE) {
> enum vlog_level level = module->levels[facility];
> if (level > module->min_level) {
> module->min_level = level;
> @@ -279,10 +280,10 @@ vlog_set_log_file(const char *file_name)
> int error;
>
> /* Close old log file. */
> - if (log_file) {
> + if (log_fd >= 0) {
> VLOG_INFO("closing log file");
> - fclose(log_file);
> - log_file = NULL;
> + close(log_fd);
> + log_fd = -1;
> }
>
> /* Update log file name and free old name. The ordering is important
> @@ -296,13 +297,13 @@ vlog_set_log_file(const char *file_name)
>
> /* Open new log file and update min_levels[] to reflect whether we actually
> * have a log_file. */
> - log_file = fopen(log_file_name, "a");
> + log_fd = open(log_file_name, O_WRONLY | O_CREAT | O_APPEND, 0666);
> for (mp = vlog_modules; mp < &vlog_modules[n_vlog_modules]; mp++) {
> update_min_level(*mp);
> }
>
> /* Log success or failure. */
> - if (!log_file) {
> + if (log_fd < 0) {
> VLOG_WARN("failed to open %s for logging: %s",
> log_file_name, strerror(errno));
> error = errno;
> @@ -330,8 +331,8 @@ vlog_reopen_log_file(void)
> /* Skip re-opening if it would be a no-op because the old and new files are
> * the same. (This avoids writing "closing log file" followed immediately
> * by "opened log file".) */
> - if (log_file
> - && !fstat(fileno(log_file), &old)
> + if (log_fd >= 0
> + && !fstat(log_fd, &old)
> && !stat(log_file_name, &new)
> && old.st_dev == new.st_dev
> && old.st_ino == new.st_ino) {
> @@ -682,7 +683,7 @@ vlog_valist(const struct vlog_module *module, enum vlog_level level,
> {
> bool log_to_console = module->levels[VLF_CONSOLE] >= level;
> bool log_to_syslog = module->levels[VLF_SYSLOG] >= level;
> - bool log_to_file = module->levels[VLF_FILE] >= level && log_file;
> + bool log_to_file = module->levels[VLF_FILE] >= level && log_fd >= 0;
> if (log_to_console || log_to_syslog || log_to_file) {
> int save_errno = errno;
> static unsigned int msg_num;
> @@ -718,8 +719,7 @@ vlog_valist(const struct vlog_module *module, enum vlog_level level,
> format_log_message(module, level, VLF_FILE, msg_num,
> message, args, &s);
> ds_put_char(&s, '\n');
> - fputs(ds_cstr(&s), log_file);
> - fflush(log_file);
> + write(log_fd, s.string, s.length);
> }
>
> ds_destroy(&s);
> --
> 1.7.2.5
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
More information about the dev
mailing list