diff --git a/src/shrpx_log.cc b/src/shrpx_log.cc index d31fa023..5c853e9b 100644 --- a/src/shrpx_log.cc +++ b/src/shrpx_log.cc @@ -326,31 +326,25 @@ void upstream_accesslog(const std::vector &lfv, int reopen_log_files() { int res = 0; + int new_accesslog_fd = -1; + int new_errorlog_fd = -1; auto lgconf = log_config(); - if (lgconf->accesslog_fd != -1) { - close(lgconf->accesslog_fd); - lgconf->accesslog_fd = -1; - } - if (!get_config()->accesslog_syslog && get_config()->accesslog_file) { - lgconf->accesslog_fd = - util::reopen_log_file(get_config()->accesslog_file.get()); + new_accesslog_fd = util::open_log_file(get_config()->accesslog_file.get()); - if (lgconf->accesslog_fd == -1) { + if (new_accesslog_fd == -1) { LOG(ERROR) << "Failed to open accesslog file " << get_config()->accesslog_file.get(); res = -1; } } - int new_errorlog_fd = -1; - if (!get_config()->errorlog_syslog && get_config()->errorlog_file) { - new_errorlog_fd = util::reopen_log_file(get_config()->errorlog_file.get()); + new_errorlog_fd = util::open_log_file(get_config()->errorlog_file.get()); if (new_errorlog_fd == -1) { if (lgconf->errorlog_fd != -1) { @@ -365,16 +359,13 @@ int reopen_log_files() { } } - if (lgconf->errorlog_fd != -1) { - close(lgconf->errorlog_fd); - lgconf->errorlog_fd = -1; - lgconf->errorlog_tty = false; - } + util::close_log_file(lgconf->accesslog_fd); + util::close_log_file(lgconf->errorlog_fd); - if (new_errorlog_fd != -1) { - lgconf->errorlog_fd = new_errorlog_fd; - lgconf->errorlog_tty = isatty(lgconf->errorlog_fd); - } + lgconf->accesslog_fd = new_accesslog_fd; + lgconf->errorlog_fd = new_errorlog_fd; + lgconf->errorlog_tty = (new_errorlog_fd == -1) ? + false : isatty(new_errorlog_fd); return res; } diff --git a/src/util.cc b/src/util.cc index a5865606..6f72366f 100644 --- a/src/util.cc +++ b/src/util.cc @@ -657,7 +657,21 @@ std::string numeric_name(const struct sockaddr *sa, socklen_t salen) { return host.data(); } -int reopen_log_file(const char *path) { + +void close_log_file(int &fd) { + if (fd != STDERR_FILENO && fd != STDOUT_FILENO && fd != -1) { + close(fd); + } + fd = -1; +} + +int open_log_file(const char *path) { + if (strcmp(path, "/dev/stdout") == 0) { + return STDOUT_FILENO; + } + if (strcmp(path, "/dev/stderr") == 0) { + return STDERR_FILENO; + } #if defined(__ANDROID__) || defined(ANDROID) int fd; diff --git a/src/util.h b/src/util.h index b945e9f2..b6860a07 100644 --- a/src/util.h +++ b/src/util.h @@ -516,10 +516,15 @@ bool numeric_host(const char *hostname); // failed, "unknown" is returned. std::string numeric_name(const struct sockaddr *sa, socklen_t salen); +// Closes |fd| which was returned by open_log_file (see below) +// and sets it to -1. In the case that |fd| points to stdout or +// stderr, or is -1, the descriptor is not closed (but still set to -1). +void close_log_file(int &fd); + // Opens |path| with O_APPEND enabled. If file does not exist, it is // created first. This function returns file descriptor referring the // opened file if it succeeds, or -1. -int reopen_log_file(const char *path); +int open_log_file(const char *path); // Returns ASCII dump of |data| of length |len|. Only ASCII printable // characters are preserved. Other characters are replaced with ".".