changeset 2743:d8316f307b6a

issue start up errors and warning on both stderr and error_log
author Igor Sysoev <igor@sysoev.ru>
date Thu, 23 Apr 2009 11:13:12 +0000
parents e138f820b5dc
children e50a2faac31d
files auto/configure src/core/nginx.c src/core/ngx_conf_file.c src/core/ngx_cycle.c src/core/ngx_log.c src/core/ngx_log.h src/os/unix/ngx_files.h src/os/unix/ngx_os.h src/os/win32/ngx_files.h src/os/win32/ngx_os.h src/os/win32/ngx_win32_init.c
diffstat 11 files changed, 116 insertions(+), 65 deletions(-) [+]
line wrap: on
line diff
--- a/auto/configure
+++ b/auto/configure
@@ -71,9 +71,7 @@ have=NGX_CONF_PREFIX value="\"$NGX_CONF_
 have=NGX_CONF_PATH value="\"$NGX_CONF_PATH\"" . auto/define
 have=NGX_PID_PATH value="\"$NGX_PID_PATH\"" . auto/define
 have=NGX_LOCK_PATH value="\"$NGX_LOCK_PATH\"" . auto/define
-if test -n "$NGX_ERROR_LOG_PATH"; then
-    have=NGX_ERROR_LOG_PATH value="\"$NGX_ERROR_LOG_PATH\"" . auto/define
-fi
+have=NGX_ERROR_LOG_PATH value="\"$NGX_ERROR_LOG_PATH\"" . auto/define
 
 have=NGX_HTTP_LOG_PATH value="\"$NGX_HTTP_LOG_PATH\"" . auto/define
 have=NGX_HTTP_CLIENT_TEMP_PATH value="\"$NGX_HTTP_CLIENT_TEMP_PATH\""
--- a/src/core/nginx.c
+++ b/src/core/nginx.c
@@ -207,10 +207,10 @@ main(int argc, char *const *argv)
     }
 
     if (ngx_show_version) {
-        ngx_log_stderr("nginx version: " NGINX_VER);
+        ngx_log_stderr(0, "nginx version: " NGINX_VER);
 
         if (ngx_show_help) {
-            ngx_log_stderr(
+            ngx_log_stderr(0,
                 "Usage: nginx [-?hvVt] [-s signal] [-c filename] "
                              "[-g directives]" CRLF CRLF
                 "Options:" CRLF
@@ -230,9 +230,9 @@ main(int argc, char *const *argv)
 
         if (ngx_show_configure) {
 #ifdef NGX_COMPILER
-            ngx_log_stderr("built by " NGX_COMPILER);
+            ngx_log_stderr(0, "built by " NGX_COMPILER);
 #endif
-            ngx_log_stderr("configure arguments: " NGX_CONFIGURE);
+            ngx_log_stderr(0, "configure arguments: " NGX_CONFIGURE);
         }
 
         if (!ngx_test_config) {
@@ -308,7 +308,7 @@ main(int argc, char *const *argv)
     cycle = ngx_init_cycle(&init_cycle);
     if (cycle == NULL) {
         if (ngx_test_config) {
-            ngx_log_stderr("the configuration file %s test failed",
+            ngx_log_stderr(0, "configuration file %s test failed",
                            init_cycle.conf_file.data);
         }
 
@@ -316,7 +316,7 @@ main(int argc, char *const *argv)
     }
 
     if (ngx_test_config) {
-        ngx_log_stderr("the configuration file %s was tested successfully",
+        ngx_log_stderr(0, "configuration file %s test is successful",
                        cycle->conf_file.data);
         return 0;
     }
@@ -355,6 +355,17 @@ main(int argc, char *const *argv)
         return 1;
     }
 
+    if (cycle->log->file->fd != ngx_stderr) {
+
+        if (ngx_set_stderr(cycle->log->file->fd) == NGX_FILE_ERROR) {
+            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
+                          ngx_set_stderr_n " failed");
+            return 1;
+        }
+    }
+
+    ngx_use_stderr = 0;
+
     if (ngx_process == NGX_PROCESS_SINGLE) {
         ngx_single_process_cycle(cycle);
 
@@ -622,7 +633,7 @@ ngx_get_options(int argc, char *const *a
         p = (u_char *) argv[i];
 
         if (*p++ != '-') {
-            ngx_log_stderr("invalid option: \"%s\"", argv[i]);
+            ngx_log_stderr(0, "invalid option: \"%s\"", argv[i]);
             return NGX_ERROR;
         }
 
@@ -660,7 +671,7 @@ ngx_get_options(int argc, char *const *a
                     goto next;
                 }
 
-                ngx_log_stderr("the option \"-c\" requires file name");
+                ngx_log_stderr(0, "option \"-c\" requires file name");
                 return NGX_ERROR;
 
             case 'g':
@@ -674,7 +685,7 @@ ngx_get_options(int argc, char *const *a
                     goto next;
                 }
 
-                ngx_log_stderr("the option \"-g\" requires parameter");
+                ngx_log_stderr(0, "option \"-g\" requires parameter");
                 return NGX_ERROR;
 
             case 's':
@@ -685,7 +696,7 @@ ngx_get_options(int argc, char *const *a
                     ngx_signal = argv[i];
 
                 } else {
-                    ngx_log_stderr("the option \"-s\" requires parameter");
+                    ngx_log_stderr(0, "option \"-s\" requires parameter");
                     return NGX_ERROR;
                 }
 
@@ -698,11 +709,11 @@ ngx_get_options(int argc, char *const *a
                     goto next;
                 }
 
-                ngx_log_stderr("invalid option: \"-s %s\"", ngx_signal);
+                ngx_log_stderr(0, "invalid option: \"-s %s\"", ngx_signal);
                 return NGX_ERROR;
 
             default:
-                ngx_log_stderr("invalid option: \"%c\"", *(p - 1));
+                ngx_log_stderr(0, "invalid option: \"%c\"", *(p - 1));
                 return NGX_ERROR;
             }
         }
--- a/src/core/ngx_conf_file.c
+++ b/src/core/ngx_conf_file.c
@@ -892,7 +892,7 @@ ngx_conf_open_file(ngx_cycle_t *cycle, n
         file->name = full;
 
     } else {
-        file->fd = ngx_stderr_fileno;
+        file->fd = ngx_stderr;
         file->name.len = 0;
         file->name.data = NULL;
     }
--- a/src/core/ngx_cycle.c
+++ b/src/core/ngx_cycle.c
@@ -270,7 +270,7 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
     }
 
     if (ngx_test_config) {
-        ngx_log_stderr("the configuration file %s syntax is ok",
+        ngx_log_stderr(0, "the configuration file %s syntax is ok",
                        cycle->conf_file.data);
     }
 
@@ -582,25 +582,14 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
 
     /* commit the new cycle configuration */
 
-#if !(NGX_WIN32)
-
-    if (!ngx_test_config && cycle->log->file->fd != STDERR_FILENO) {
+    if (!ngx_use_stderr && cycle->log->file->fd != ngx_stderr) {
 
-        ngx_log_debug3(NGX_LOG_DEBUG_CORE, log, 0,
-                       "dup2: %p %d \"%s\"",
-                       cycle->log->file,
-                       cycle->log->file->fd, cycle->log->file->name.data);
-
-        if (dup2(cycle->log->file->fd, STDERR_FILENO) == -1) {
-            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
-                          "dup2(STDERR) failed");
-            /* fatal */
-            exit(1);
+        if (ngx_set_stderr(cycle->log->file->fd) == NGX_FILE_ERROR) {
+            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+                          ngx_set_stderr_n " failed");
         }
     }
 
-#endif
-
     pool->log = cycle->log;
 
     for (i = 0; ngx_modules[i]; i++) {
@@ -697,7 +686,7 @@ old_shm_zone_done:
             i = 0;
         }
 
-        if (file[i].fd == NGX_INVALID_FILE || file[i].fd == ngx_stderr_fileno) {
+        if (file[i].fd == NGX_INVALID_FILE || file[i].fd == ngx_stderr) {
             continue;
         }
 
@@ -797,7 +786,7 @@ failed:
             i = 0;
         }
 
-        if (file[i].fd == NGX_INVALID_FILE || file[i].fd == ngx_stderr_fileno) {
+        if (file[i].fd == NGX_INVALID_FILE || file[i].fd == ngx_stderr) {
             continue;
         }
 
--- a/src/core/ngx_log.c
+++ b/src/core/ngx_log.c
@@ -48,7 +48,8 @@ ngx_module_t  ngx_errlog_module = {
 
 
 static ngx_log_t        ngx_log;
-static ngx_open_file_t  ngx_stderr;
+static ngx_open_file_t  ngx_log_file;
+ngx_uint_t              ngx_use_stderr = 1;
 
 
 static ngx_str_t err_levels[] = {
@@ -86,7 +87,8 @@ ngx_log_error_core(ngx_uint_t level, ngx
 #if (NGX_HAVE_VARIADIC_MACROS)
     va_list  args;
 #endif
-    u_char   errstr[NGX_MAX_ERROR_STR], *p, *last;
+    u_char  *p, *last, *msg;
+    u_char   errstr[NGX_MAX_ERROR_STR];
 
     if (log->file->fd == NGX_INVALID_FILE) {
         return;
@@ -109,6 +111,8 @@ ngx_log_error_core(ngx_uint_t level, ngx
         p = ngx_snprintf(p, last - p, "*%uA ", log->connection);
     }
 
+    msg = p;
+
 #if (NGX_HAVE_VARIADIC_MACROS)
 
     va_start(args, fmt);
@@ -158,6 +162,19 @@ ngx_log_error_core(ngx_uint_t level, ngx
     ngx_linefeed(p);
 
     (void) ngx_write_fd(log->file->fd, errstr, p - errstr);
+
+    if (!ngx_use_stderr
+        || level > NGX_LOG_WARN
+        || log->file->fd == ngx_stderr)
+    {
+        return;
+    }
+
+    msg -= (err_levels[level].len + 4);
+
+    (void) ngx_sprintf(msg, "[%V]: ", &err_levels[level]);
+
+    ngx_write_fd(ngx_stderr, msg, p - msg);
 }
 
 
@@ -198,9 +215,9 @@ ngx_log_abort(ngx_err_t err, const char 
 
 
 void ngx_cdecl
-ngx_log_stderr(const char *fmt, ...)
+ngx_log_stderr(ngx_err_t err, const char *fmt, ...)
 {
-    u_char   *p;
+    u_char   *p, *last;
     va_list   args;
     u_char    errstr[NGX_MAX_ERROR_STR];
 
@@ -212,46 +229,75 @@ ngx_log_stderr(const char *fmt, ...)
         p = errstr + NGX_MAX_ERROR_STR - NGX_LINEFEED_SIZE;
     }
 
-    ngx_linefeed(p);
+    if (err) {
+
+        last = errstr + NGX_MAX_ERROR_STR;
+
+        if (p > last - 50) {
+
+            /* leave a space for an error code */
+
+            p = last - 50;
+            *p++ = '.';
+            *p++ = '.';
+            *p++ = '.';
+        }
 
 #if (NGX_WIN32)
+        p = ngx_snprintf(p, last - p, ((unsigned) err < 0x80000000)
+                                           ? " (%d: " : " (%Xd: ", err);
+#else
+        p = ngx_snprintf(p, last - p, " (%d: ", err);
+#endif
 
-    if (ngx_stderr_fileno == NULL) {
-        ngx_stderr_fileno = GetStdHandle(STD_ERROR_HANDLE);
+        p = ngx_strerror_r(err, p, last - p);
+
+        if (p < last) {
+            *p++ = ')';
+        }
     }
 
-#endif
+    ngx_linefeed(p);
 
-    (void) ngx_write_fd(ngx_stderr_fileno, errstr, p - errstr);
+    ngx_write_fd(ngx_stderr, errstr, p - errstr);
 }
 
 
 ngx_log_t *
 ngx_log_init(void)
 {
-    ngx_log.file = &ngx_stderr;
+    ngx_log.file = &ngx_log_file;
     ngx_log.log_level = NGX_LOG_NOTICE;
 
+    /*
+     * we use ngx_strlen() here since BCC warns about
+     * condition is always false and unreachable code
+     */
+
+    if (ngx_strlen(NGX_ERROR_LOG_PATH) == 0) {
+        ngx_log_file.fd = ngx_stderr;
+        return &ngx_log;
+    }
+
+    ngx_log_file.fd = ngx_open_file((u_char *) NGX_ERROR_LOG_PATH,
+                                    NGX_FILE_APPEND,
+                                    NGX_FILE_CREATE_OR_OPEN,
+                                    NGX_FILE_DEFAULT_ACCESS);
+
+    if (ngx_log_file.fd == NGX_INVALID_FILE) {
+        ngx_log_stderr(ngx_errno,
+                       "[emerg]: could not open error log file: "
+                       ngx_open_file_n " \"" NGX_ERROR_LOG_PATH "\" failed");
+
 #if (NGX_WIN32)
+        ngx_event_log(ngx_errno,
+                       "could not open error log file: "
+                       ngx_open_file_n " \"" NGX_ERROR_LOG_PATH "\" failed");
+#endif
 
-    ngx_stderr.fd = ngx_open_file((u_char *) NGX_ERROR_LOG_PATH,
-                                  NGX_FILE_APPEND,
-                                  NGX_FILE_CREATE_OR_OPEN,
-                                  NGX_FILE_DEFAULT_ACCESS);
-
-    if (ngx_stderr.fd == NGX_INVALID_FILE) {
-        ngx_event_log(ngx_errno,
-                      "Could not open error log file: "
-                      ngx_open_file_n " \"" NGX_ERROR_LOG_PATH "\" failed");
         return NULL;
     }
 
-#else
-
-    ngx_stderr.fd = STDERR_FILENO;
-
-#endif
-
     return &ngx_log;
 }
 
@@ -349,7 +395,7 @@ ngx_set_error_log(ngx_conf_t *cf, ngx_co
     value = cf->args->elts;
 
     if (value[1].len == 6 && ngx_strcmp(value[1].data, "stderr") == 0) {
-        cf->cycle->new_log->file->fd = ngx_stderr.fd;
+        cf->cycle->new_log->file->fd = ngx_stderr;
         cf->cycle->new_log->file->name.len = 0;
         cf->cycle->new_log->file->name.data = NULL;
 
--- a/src/core/ngx_log.h
+++ b/src/core/ngx_log.h
@@ -199,10 +199,11 @@ ngx_log_t *ngx_log_init(void);
 ngx_log_t *ngx_log_create_errlog(ngx_cycle_t *cycle, ngx_array_t *args);
 char *ngx_set_error_log_levels(ngx_conf_t *cf, ngx_log_t *log);
 void ngx_log_abort(ngx_err_t err, const char *text, void *param);
-void ngx_cdecl ngx_log_stderr(const char *fmt, ...);
+void ngx_cdecl ngx_log_stderr(ngx_err_t err, const char *fmt, ...);
 
 
 extern ngx_module_t  ngx_errlog_module;
+extern ngx_uint_t    ngx_use_stderr;
 
 
 #endif /* _NGX_LOG_H_INCLUDED_ */
--- a/src/os/unix/ngx_files.h
+++ b/src/os/unix/ngx_files.h
@@ -273,8 +273,12 @@ ngx_int_t ngx_directio_off(ngx_fd_t fd);
 
 #endif
 
-
 size_t ngx_fs_bsize(u_char *name);
 
 
+#define ngx_stderr               STDERR_FILENO
+#define ngx_set_stderr(fd)       dup2(fd, STDERR_FILENO)
+#define ngx_set_stderr_n         "dup2(STDERR_FILENO)"
+
+
 #endif /* _NGX_FILES_H_INCLUDED_ */
--- a/src/os/unix/ngx_os.h
+++ b/src/os/unix/ngx_os.h
@@ -54,7 +54,6 @@ extern ngx_int_t    ngx_max_sockets;
 extern ngx_uint_t   ngx_inherited_nonblocking;
 extern ngx_uint_t   ngx_tcp_nodelay_and_tcp_nopush;
 
-#define ngx_stderr_fileno  STDERR_FILENO
 
 #if (NGX_FREEBSD)
 #include <ngx_freebsd.h>
--- a/src/os/win32/ngx_files.h
+++ b/src/os/win32/ngx_files.h
@@ -237,4 +237,9 @@ ngx_int_t ngx_directio_off(ngx_fd_t fd);
 size_t ngx_fs_bsize(u_char *name);
 
 
+#define ngx_stderr               GetStdHandle(STD_ERROR_HANDLE)
+#define ngx_set_stderr(fd)       SetStdHandle(STD_ERROR_HANDLE, fd)
+#define ngx_set_stderr_n         "SetStdHandle(STD_ERROR_HANDLE)"
+
+
 #endif /* _NGX_FILES_H_INCLUDED_ */
--- a/src/os/win32/ngx_os.h
+++ b/src/os/win32/ngx_os.h
@@ -58,7 +58,6 @@ extern ngx_int_t    ngx_max_sockets;
 extern ngx_uint_t   ngx_inherited_nonblocking;
 extern ngx_uint_t   ngx_tcp_nodelay_and_tcp_nopush;
 extern ngx_uint_t   ngx_win32_version;
-extern ngx_fd_t     ngx_stderr_fileno;
 extern char         ngx_unique[];
 
 
--- a/src/os/win32/ngx_win32_init.c
+++ b/src/os/win32/ngx_win32_init.c
@@ -16,7 +16,6 @@ ngx_int_t   ngx_max_sockets;
 ngx_uint_t  ngx_inherited_nonblocking = 1;
 ngx_uint_t  ngx_tcp_nodelay_and_tcp_nopush;
 
-ngx_fd_t    ngx_stderr_fileno;
 char        ngx_unique[NGX_INT32_LEN + 1];