1e18a033bSKonstantin Ananyev
2e18a033bSKonstantin Ananyev/*
3e18a033bSKonstantin Ananyev * Copyright (C) Igor Sysoev
4e18a033bSKonstantin Ananyev * Copyright (C) Nginx, Inc.
5e18a033bSKonstantin Ananyev */
6e18a033bSKonstantin Ananyev
7e18a033bSKonstantin Ananyev
8e18a033bSKonstantin Ananyev#include <ngx_config.h>
9e18a033bSKonstantin Ananyev#include <ngx_core.h>
10e18a033bSKonstantin Ananyev
11e18a033bSKonstantin Ananyev
12e18a033bSKonstantin Ananyevstatic char *ngx_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
13e18a033bSKonstantin Ananyevstatic char *ngx_log_set_levels(ngx_conf_t *cf, ngx_log_t *log);
14e18a033bSKonstantin Ananyevstatic void ngx_log_insert(ngx_log_t *log, ngx_log_t *new_log);
15e18a033bSKonstantin Ananyev
16e18a033bSKonstantin Ananyev
17e18a033bSKonstantin Ananyev#if (NGX_DEBUG)
18e18a033bSKonstantin Ananyev
19e18a033bSKonstantin Ananyevstatic void ngx_log_memory_writer(ngx_log_t *log, ngx_uint_t level,
20e18a033bSKonstantin Ananyev    u_char *buf, size_t len);
21e18a033bSKonstantin Ananyevstatic void ngx_log_memory_cleanup(void *data);
22e18a033bSKonstantin Ananyev
23e18a033bSKonstantin Ananyev
24e18a033bSKonstantin Ananyevtypedef struct {
25e18a033bSKonstantin Ananyev    u_char        *start;
26e18a033bSKonstantin Ananyev    u_char        *end;
27e18a033bSKonstantin Ananyev    u_char        *pos;
28e18a033bSKonstantin Ananyev    ngx_atomic_t   written;
29e18a033bSKonstantin Ananyev} ngx_log_memory_buf_t;
30e18a033bSKonstantin Ananyev
31e18a033bSKonstantin Ananyev#endif
32e18a033bSKonstantin Ananyev
33e18a033bSKonstantin Ananyev
34e18a033bSKonstantin Ananyevstatic ngx_command_t  ngx_errlog_commands[] = {
35e18a033bSKonstantin Ananyev
36e18a033bSKonstantin Ananyev    { ngx_string("error_log"),
37e18a033bSKonstantin Ananyev      NGX_MAIN_CONF|NGX_CONF_1MORE,
38e18a033bSKonstantin Ananyev      ngx_error_log,
39e18a033bSKonstantin Ananyev      0,
40e18a033bSKonstantin Ananyev      0,
41e18a033bSKonstantin Ananyev      NULL },
42e18a033bSKonstantin Ananyev
43e18a033bSKonstantin Ananyev      ngx_null_command
44e18a033bSKonstantin Ananyev};
45e18a033bSKonstantin Ananyev
46e18a033bSKonstantin Ananyev
47e18a033bSKonstantin Ananyevstatic ngx_core_module_t  ngx_errlog_module_ctx = {
48e18a033bSKonstantin Ananyev    ngx_string("errlog"),
49e18a033bSKonstantin Ananyev    NULL,
50e18a033bSKonstantin Ananyev    NULL
51e18a033bSKonstantin Ananyev};
52e18a033bSKonstantin Ananyev
53e18a033bSKonstantin Ananyev
54e18a033bSKonstantin Ananyevngx_module_t  ngx_errlog_module = {
55e18a033bSKonstantin Ananyev    NGX_MODULE_V1,
56e18a033bSKonstantin Ananyev    &ngx_errlog_module_ctx,                /* module context */
57e18a033bSKonstantin Ananyev    ngx_errlog_commands,                   /* module directives */
58e18a033bSKonstantin Ananyev    NGX_CORE_MODULE,                       /* module type */
59e18a033bSKonstantin Ananyev    NULL,                                  /* init master */
60e18a033bSKonstantin Ananyev    NULL,                                  /* init module */
61e18a033bSKonstantin Ananyev    NULL,                                  /* init process */
62e18a033bSKonstantin Ananyev    NULL,                                  /* init thread */
63e18a033bSKonstantin Ananyev    NULL,                                  /* exit thread */
64e18a033bSKonstantin Ananyev    NULL,                                  /* exit process */
65e18a033bSKonstantin Ananyev    NULL,                                  /* exit master */
66e18a033bSKonstantin Ananyev    NGX_MODULE_V1_PADDING
67e18a033bSKonstantin Ananyev};
68e18a033bSKonstantin Ananyev
69e18a033bSKonstantin Ananyev
70e18a033bSKonstantin Ananyevstatic ngx_log_t        ngx_log;
71e18a033bSKonstantin Ananyevstatic ngx_open_file_t  ngx_log_file;
72e18a033bSKonstantin Ananyevngx_uint_t              ngx_use_stderr = 1;
73e18a033bSKonstantin Ananyev
74e18a033bSKonstantin Ananyev
75e18a033bSKonstantin Ananyevstatic ngx_str_t err_levels[] = {
76e18a033bSKonstantin Ananyev    ngx_null_string,
77e18a033bSKonstantin Ananyev    ngx_string("emerg"),
78e18a033bSKonstantin Ananyev    ngx_string("alert"),
79e18a033bSKonstantin Ananyev    ngx_string("crit"),
80e18a033bSKonstantin Ananyev    ngx_string("error"),
81e18a033bSKonstantin Ananyev    ngx_string("warn"),
82e18a033bSKonstantin Ananyev    ngx_string("notice"),
83e18a033bSKonstantin Ananyev    ngx_string("info"),
84e18a033bSKonstantin Ananyev    ngx_string("debug")
85e18a033bSKonstantin Ananyev};
86e18a033bSKonstantin Ananyev
87e18a033bSKonstantin Ananyevstatic const char *debug_levels[] = {
88e18a033bSKonstantin Ananyev    "debug_core", "debug_alloc", "debug_mutex", "debug_event",
89e18a033bSKonstantin Ananyev    "debug_http", "debug_mail", "debug_stream"
90e18a033bSKonstantin Ananyev};
91e18a033bSKonstantin Ananyev
92e18a033bSKonstantin Ananyev
93e18a033bSKonstantin Ananyev#if (NGX_HAVE_VARIADIC_MACROS)
94e18a033bSKonstantin Ananyev
95e18a033bSKonstantin Ananyevvoid
96e18a033bSKonstantin Ananyevngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
97e18a033bSKonstantin Ananyev    const char *fmt, ...)
98e18a033bSKonstantin Ananyev
99e18a033bSKonstantin Ananyev#else
100e18a033bSKonstantin Ananyev
101e18a033bSKonstantin Ananyevvoid
102e18a033bSKonstantin Ananyevngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
103e18a033bSKonstantin Ananyev    const char *fmt, va_list args)
104e18a033bSKonstantin Ananyev
105e18a033bSKonstantin Ananyev#endif
106e18a033bSKonstantin Ananyev{
107e18a033bSKonstantin Ananyev#if (NGX_HAVE_VARIADIC_MACROS)
108e18a033bSKonstantin Ananyev    va_list      args;
109e18a033bSKonstantin Ananyev#endif
110e18a033bSKonstantin Ananyev    u_char      *p, *last, *msg;
111e18a033bSKonstantin Ananyev    ssize_t      n;
112e18a033bSKonstantin Ananyev    ngx_uint_t   wrote_stderr, debug_connection;
113e18a033bSKonstantin Ananyev    u_char       errstr[NGX_MAX_ERROR_STR];
114e18a033bSKonstantin Ananyev
115e18a033bSKonstantin Ananyev    last = errstr + NGX_MAX_ERROR_STR;
116e18a033bSKonstantin Ananyev
117e18a033bSKonstantin Ananyev    p = ngx_cpymem(errstr, ngx_cached_err_log_time.data,
118e18a033bSKonstantin Ananyev                   ngx_cached_err_log_time.len);
119e18a033bSKonstantin Ananyev
120e18a033bSKonstantin Ananyev    p = ngx_slprintf(p, last, " [%V] ", &err_levels[level]);
121e18a033bSKonstantin Ananyev
122e18a033bSKonstantin Ananyev    /* pid#tid */
123e18a033bSKonstantin Ananyev    p = ngx_slprintf(p, last, "%P#" NGX_TID_T_FMT ": ",
124e18a033bSKonstantin Ananyev                    ngx_log_pid, ngx_log_tid);
125e18a033bSKonstantin Ananyev
126e18a033bSKonstantin Ananyev    if (log->connection) {
127e18a033bSKonstantin Ananyev        p = ngx_slprintf(p, last, "*%uA ", log->connection);
128e18a033bSKonstantin Ananyev    }
129e18a033bSKonstantin Ananyev
130e18a033bSKonstantin Ananyev    msg = p;
131e18a033bSKonstantin Ananyev
132e18a033bSKonstantin Ananyev#if (NGX_HAVE_VARIADIC_MACROS)
133e18a033bSKonstantin Ananyev
134e18a033bSKonstantin Ananyev    va_start(args, fmt);
135e18a033bSKonstantin Ananyev    p = ngx_vslprintf(p, last, fmt, args);
136e18a033bSKonstantin Ananyev    va_end(args);
137e18a033bSKonstantin Ananyev
138e18a033bSKonstantin Ananyev#else
139e18a033bSKonstantin Ananyev
140e18a033bSKonstantin Ananyev    p = ngx_vslprintf(p, last, fmt, args);
141e18a033bSKonstantin Ananyev
142e18a033bSKonstantin Ananyev#endif
143e18a033bSKonstantin Ananyev
144e18a033bSKonstantin Ananyev    if (err) {
145e18a033bSKonstantin Ananyev        p = ngx_log_errno(p, last, err);
146e18a033bSKonstantin Ananyev    }
147e18a033bSKonstantin Ananyev
148e18a033bSKonstantin Ananyev    if (level != NGX_LOG_DEBUG && log->handler) {
149e18a033bSKonstantin Ananyev        p = log->handler(log, p, last - p);
150e18a033bSKonstantin Ananyev    }
151e18a033bSKonstantin Ananyev
152e18a033bSKonstantin Ananyev    if (p > last - NGX_LINEFEED_SIZE) {
153e18a033bSKonstantin Ananyev        p = last - NGX_LINEFEED_SIZE;
154e18a033bSKonstantin Ananyev    }
155e18a033bSKonstantin Ananyev
156e18a033bSKonstantin Ananyev    ngx_linefeed(p);
157e18a033bSKonstantin Ananyev
158e18a033bSKonstantin Ananyev    wrote_stderr = 0;
159e18a033bSKonstantin Ananyev    debug_connection = (log->log_level & NGX_LOG_DEBUG_CONNECTION) != 0;
160e18a033bSKonstantin Ananyev
161e18a033bSKonstantin Ananyev    while (log) {
162e18a033bSKonstantin Ananyev
163e18a033bSKonstantin Ananyev        if (log->log_level < level && !debug_connection) {
164e18a033bSKonstantin Ananyev            break;
165e18a033bSKonstantin Ananyev        }
166e18a033bSKonstantin Ananyev
167e18a033bSKonstantin Ananyev        if (log->writer) {
168e18a033bSKonstantin Ananyev            log->writer(log, level, errstr, p - errstr);
169e18a033bSKonstantin Ananyev            goto next;
170e18a033bSKonstantin Ananyev        }
171e18a033bSKonstantin Ananyev
172e18a033bSKonstantin Ananyev        if (ngx_time() == log->disk_full_time) {
173e18a033bSKonstantin Ananyev
174e18a033bSKonstantin Ananyev            /*
175e18a033bSKonstantin Ananyev             * on FreeBSD writing to a full filesystem with enabled softupdates
176e18a033bSKonstantin Ananyev             * may block process for much longer time than writing to non-full
177e18a033bSKonstantin Ananyev             * filesystem, so we skip writing to a log for one second
178e18a033bSKonstantin Ananyev             */
179e18a033bSKonstantin Ananyev
180e18a033bSKonstantin Ananyev            goto next;
181e18a033bSKonstantin Ananyev        }
182e18a033bSKonstantin Ananyev
183e18a033bSKonstantin Ananyev        n = ngx_write_fd(log->file->fd, errstr, p - errstr);
184e18a033bSKonstantin Ananyev
185e18a033bSKonstantin Ananyev        if (n == -1 && ngx_errno == NGX_ENOSPC) {
186e18a033bSKonstantin Ananyev            log->disk_full_time = ngx_time();
187e18a033bSKonstantin Ananyev        }
188e18a033bSKonstantin Ananyev
189e18a033bSKonstantin Ananyev        if (log->file->fd == ngx_stderr) {
190e18a033bSKonstantin Ananyev            wrote_stderr = 1;
191e18a033bSKonstantin Ananyev        }
192e18a033bSKonstantin Ananyev
193e18a033bSKonstantin Ananyev    next:
194e18a033bSKonstantin Ananyev
195e18a033bSKonstantin Ananyev        log = log->next;
196e18a033bSKonstantin Ananyev    }
197e18a033bSKonstantin Ananyev
198e18a033bSKonstantin Ananyev    if (!ngx_use_stderr
199e18a033bSKonstantin Ananyev        || level > NGX_LOG_WARN
200e18a033bSKonstantin Ananyev        || wrote_stderr)
201e18a033bSKonstantin Ananyev    {
202e18a033bSKonstantin Ananyev        return;
203e18a033bSKonstantin Ananyev    }
204e18a033bSKonstantin Ananyev
205e18a033bSKonstantin Ananyev    msg -= (7 + err_levels[level].len + 3);
206e18a033bSKonstantin Ananyev
207e18a033bSKonstantin Ananyev    (void) ngx_sprintf(msg, "nginx: [%V] ", &err_levels[level]);
208e18a033bSKonstantin Ananyev
209e18a033bSKonstantin Ananyev    (void) ngx_write_console(ngx_stderr, msg, p - msg);
210e18a033bSKonstantin Ananyev}
211e18a033bSKonstantin Ananyev
212e18a033bSKonstantin Ananyev
213e18a033bSKonstantin Ananyev#if !(NGX_HAVE_VARIADIC_MACROS)
214e18a033bSKonstantin Ananyev
215e18a033bSKonstantin Ananyevvoid ngx_cdecl
216e18a033bSKonstantin Ananyevngx_log_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
217e18a033bSKonstantin Ananyev    const char *fmt, ...)
218e18a033bSKonstantin Ananyev{
219e18a033bSKonstantin Ananyev    va_list  args;
220e18a033bSKonstantin Ananyev
221e18a033bSKonstantin Ananyev    if (log->log_level >= level) {
222e18a033bSKonstantin Ananyev        va_start(args, fmt);
223e18a033bSKonstantin Ananyev        ngx_log_error_core(level, log, err, fmt, args);
224e18a033bSKonstantin Ananyev        va_end(args);
225e18a033bSKonstantin Ananyev    }
226e18a033bSKonstantin Ananyev}
227e18a033bSKonstantin Ananyev
228e18a033bSKonstantin Ananyev
229e18a033bSKonstantin Ananyevvoid ngx_cdecl
230e18a033bSKonstantin Ananyevngx_log_debug_core(ngx_log_t *log, ngx_err_t err, const char *fmt, ...)
231e18a033bSKonstantin Ananyev{
232e18a033bSKonstantin Ananyev    va_list  args;
233e18a033bSKonstantin Ananyev
234e18a033bSKonstantin Ananyev    va_start(args, fmt);
235e18a033bSKonstantin Ananyev    ngx_log_error_core(NGX_LOG_DEBUG, log, err, fmt, args);
236e18a033bSKonstantin Ananyev    va_end(args);
237e18a033bSKonstantin Ananyev}
238e18a033bSKonstantin Ananyev
239e18a033bSKonstantin Ananyev#endif
240e18a033bSKonstantin Ananyev
241e18a033bSKonstantin Ananyev
242e18a033bSKonstantin Ananyevvoid ngx_cdecl
243e18a033bSKonstantin Ananyevngx_log_abort(ngx_err_t err, const char *fmt, ...)
244e18a033bSKonstantin Ananyev{
245e18a033bSKonstantin Ananyev    u_char   *p;
246e18a033bSKonstantin Ananyev    va_list   args;
247e18a033bSKonstantin Ananyev    u_char    errstr[NGX_MAX_CONF_ERRSTR];
248e18a033bSKonstantin Ananyev
249e18a033bSKonstantin Ananyev    va_start(args, fmt);
250e18a033bSKonstantin Ananyev    p = ngx_vsnprintf(errstr, sizeof(errstr) - 1, fmt, args);
251e18a033bSKonstantin Ananyev    va_end(args);
252e18a033bSKonstantin Ananyev
253e18a033bSKonstantin Ananyev    ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, err,
254e18a033bSKonstantin Ananyev                  "%*s", p - errstr, errstr);
255e18a033bSKonstantin Ananyev}
256e18a033bSKonstantin Ananyev
257e18a033bSKonstantin Ananyev
258e18a033bSKonstantin Ananyevvoid ngx_cdecl
259e18a033bSKonstantin Ananyevngx_log_stderr(ngx_err_t err, const char *fmt, ...)
260e18a033bSKonstantin Ananyev{
261e18a033bSKonstantin Ananyev    u_char   *p, *last;
262e18a033bSKonstantin Ananyev    va_list   args;
263e18a033bSKonstantin Ananyev    u_char    errstr[NGX_MAX_ERROR_STR];
264e18a033bSKonstantin Ananyev
265e18a033bSKonstantin Ananyev    last = errstr + NGX_MAX_ERROR_STR;
266e18a033bSKonstantin Ananyev
267e18a033bSKonstantin Ananyev    p = ngx_cpymem(errstr, "nginx: ", 7);
268e18a033bSKonstantin Ananyev
269e18a033bSKonstantin Ananyev    va_start(args, fmt);
270e18a033bSKonstantin Ananyev    p = ngx_vslprintf(p, last, fmt, args);
271e18a033bSKonstantin Ananyev    va_end(args);
272e18a033bSKonstantin Ananyev
273e18a033bSKonstantin Ananyev    if (err) {
274e18a033bSKonstantin Ananyev        p = ngx_log_errno(p, last, err);
275e18a033bSKonstantin Ananyev    }
276e18a033bSKonstantin Ananyev
277e18a033bSKonstantin Ananyev    if (p > last - NGX_LINEFEED_SIZE) {
278e18a033bSKonstantin Ananyev        p = last - NGX_LINEFEED_SIZE;
279e18a033bSKonstantin Ananyev    }
280e18a033bSKonstantin Ananyev
281e18a033bSKonstantin Ananyev    ngx_linefeed(p);
282e18a033bSKonstantin Ananyev
283e18a033bSKonstantin Ananyev    (void) ngx_write_console(ngx_stderr, errstr, p - errstr);
284e18a033bSKonstantin Ananyev}
285e18a033bSKonstantin Ananyev
286e18a033bSKonstantin Ananyev
287e18a033bSKonstantin Ananyevu_char *
288e18a033bSKonstantin Ananyevngx_log_errno(u_char *buf, u_char *last, ngx_err_t err)
289e18a033bSKonstantin Ananyev{
290e18a033bSKonstantin Ananyev    if (buf > last - 50) {
291e18a033bSKonstantin Ananyev
292e18a033bSKonstantin Ananyev        /* leave a space for an error code */
293e18a033bSKonstantin Ananyev
294e18a033bSKonstantin Ananyev        buf = last - 50;
295e18a033bSKonstantin Ananyev        *buf++ = '.';
296e18a033bSKonstantin Ananyev        *buf++ = '.';
297e18a033bSKonstantin Ananyev        *buf++ = '.';
298e18a033bSKonstantin Ananyev    }
299e18a033bSKonstantin Ananyev
300e18a033bSKonstantin Ananyev#if (NGX_WIN32)
301e18a033bSKonstantin Ananyev    buf = ngx_slprintf(buf, last, ((unsigned) err < 0x80000000)
302e18a033bSKonstantin Ananyev                                       ? " (%d: " : " (%Xd: ", err);
303e18a033bSKonstantin Ananyev#else
304e18a033bSKonstantin Ananyev    buf = ngx_slprintf(buf, last, " (%d: ", err);
305e18a033bSKonstantin Ananyev#endif
306e18a033bSKonstantin Ananyev
307e18a033bSKonstantin Ananyev    buf = ngx_strerror(err, buf, last - buf);
308e18a033bSKonstantin Ananyev
309e18a033bSKonstantin Ananyev    if (buf < last) {
310e18a033bSKonstantin Ananyev        *buf++ = ')';
311e18a033bSKonstantin Ananyev    }
312e18a033bSKonstantin Ananyev
313e18a033bSKonstantin Ananyev    return buf;
314e18a033bSKonstantin Ananyev}
315e18a033bSKonstantin Ananyev
316e18a033bSKonstantin Ananyev
317e18a033bSKonstantin Ananyevngx_log_t *
318e18a033bSKonstantin Ananyevngx_log_init(u_char *prefix)
319e18a033bSKonstantin Ananyev{
320e18a033bSKonstantin Ananyev    u_char  *p, *name;
321e18a033bSKonstantin Ananyev    size_t   nlen, plen;
322e18a033bSKonstantin Ananyev
323e18a033bSKonstantin Ananyev    ngx_log.file = &ngx_log_file;
324e18a033bSKonstantin Ananyev    ngx_log.log_level = NGX_LOG_NOTICE;
325e18a033bSKonstantin Ananyev
326e18a033bSKonstantin Ananyev    name = (u_char *) NGX_ERROR_LOG_PATH;
327e18a033bSKonstantin Ananyev
328e18a033bSKonstantin Ananyev    /*
329e18a033bSKonstantin Ananyev     * we use ngx_strlen() here since BCC warns about
330e18a033bSKonstantin Ananyev     * condition is always false and unreachable code
331e18a033bSKonstantin Ananyev     */
332e18a033bSKonstantin Ananyev
333e18a033bSKonstantin Ananyev    nlen = ngx_strlen(name);
334e18a033bSKonstantin Ananyev
335e18a033bSKonstantin Ananyev    if (nlen == 0) {
336e18a033bSKonstantin Ananyev        ngx_log_file.fd = ngx_stderr;
337e18a033bSKonstantin Ananyev        return &ngx_log;
338e18a033bSKonstantin Ananyev    }
339e18a033bSKonstantin Ananyev
340e18a033bSKonstantin Ananyev    p = NULL;
341e18a033bSKonstantin Ananyev
342e18a033bSKonstantin Ananyev#if (NGX_WIN32)
343e18a033bSKonstantin Ananyev    if (name[1] != ':') {
344e18a033bSKonstantin Ananyev#else
345e18a033bSKonstantin Ananyev    if (name[0] != '/') {
346e18a033bSKonstantin Ananyev#endif
347e18a033bSKonstantin Ananyev
348e18a033bSKonstantin Ananyev        if (prefix) {
349e18a033bSKonstantin Ananyev            plen = ngx_strlen(prefix);
350e18a033bSKonstantin Ananyev
351e18a033bSKonstantin Ananyev        } else {
352e18a033bSKonstantin Ananyev#ifdef NGX_PREFIX
353e18a033bSKonstantin Ananyev            prefix = (u_char *) NGX_PREFIX;
354e18a033bSKonstantin Ananyev            plen = ngx_strlen(prefix);
355e18a033bSKonstantin Ananyev#else
356e18a033bSKonstantin Ananyev            plen = 0;
357e18a033bSKonstantin Ananyev#endif
358e18a033bSKonstantin Ananyev        }
359e18a033bSKonstantin Ananyev
360e18a033bSKonstantin Ananyev        if (plen) {
361e18a033bSKonstantin Ananyev            name = malloc(plen + nlen + 2);
362e18a033bSKonstantin Ananyev            if (name == NULL) {
363e18a033bSKonstantin Ananyev                return NULL;
364e18a033bSKonstantin Ananyev            }
365e18a033bSKonstantin Ananyev
366e18a033bSKonstantin Ananyev            p = ngx_cpymem(name, prefix, plen);
367e18a033bSKonstantin Ananyev
368e18a033bSKonstantin Ananyev            if (!ngx_path_separator(*(p - 1))) {
369e18a033bSKonstantin Ananyev                *p++ = '/';
370e18a033bSKonstantin Ananyev            }
371e18a033bSKonstantin Ananyev
372e18a033bSKonstantin Ananyev            ngx_cpystrn(p, (u_char *) NGX_ERROR_LOG_PATH, nlen + 1);
373e18a033bSKonstantin Ananyev
374e18a033bSKonstantin Ananyev            p = name;
375e18a033bSKonstantin Ananyev        }
376e18a033bSKonstantin Ananyev    }
377e18a033bSKonstantin Ananyev
378e18a033bSKonstantin Ananyev    ngx_log_file.fd = ngx_open_file(name, NGX_FILE_APPEND,
379e18a033bSKonstantin Ananyev                                    NGX_FILE_CREATE_OR_OPEN,
380e18a033bSKonstantin Ananyev                                    NGX_FILE_DEFAULT_ACCESS);
381e18a033bSKonstantin Ananyev
382e18a033bSKonstantin Ananyev    if (ngx_log_file.fd == NGX_INVALID_FILE) {
383e18a033bSKonstantin Ananyev        ngx_log_stderr(ngx_errno,
384e18a033bSKonstantin Ananyev                       "[alert] could not open error log file: "
385e18a033bSKonstantin Ananyev                       ngx_open_file_n " \"%s\" failed", name);
386e18a033bSKonstantin Ananyev#if (NGX_WIN32)
387e18a033bSKonstantin Ananyev        ngx_event_log(ngx_errno,
388e18a033bSKonstantin Ananyev                       "could not open error log file: "
389e18a033bSKonstantin Ananyev                       ngx_open_file_n " \"%s\" failed", name);
390e18a033bSKonstantin Ananyev#endif
391e18a033bSKonstantin Ananyev
392e18a033bSKonstantin Ananyev        ngx_log_file.fd = ngx_stderr;
393e18a033bSKonstantin Ananyev    }
394e18a033bSKonstantin Ananyev
395e18a033bSKonstantin Ananyev    if (p) {
396e18a033bSKonstantin Ananyev        ngx_free(p);
397e18a033bSKonstantin Ananyev    }
398e18a033bSKonstantin Ananyev
399e18a033bSKonstantin Ananyev    return &ngx_log;
400e18a033bSKonstantin Ananyev}
401e18a033bSKonstantin Ananyev
402e18a033bSKonstantin Ananyev
403e18a033bSKonstantin Ananyevngx_int_t
404e18a033bSKonstantin Ananyevngx_log_open_default(ngx_cycle_t *cycle)
405e18a033bSKonstantin Ananyev{
406e18a033bSKonstantin Ananyev    ngx_log_t         *log;
407e18a033bSKonstantin Ananyev    static ngx_str_t   error_log = ngx_string(NGX_ERROR_LOG_PATH);
408e18a033bSKonstantin Ananyev
409e18a033bSKonstantin Ananyev    if (ngx_log_get_file_log(&cycle->new_log) != NULL) {
410e18a033bSKonstantin Ananyev        return NGX_OK;
411e18a033bSKonstantin Ananyev    }
412e18a033bSKonstantin Ananyev
413e18a033bSKonstantin Ananyev    if (cycle->new_log.log_level != 0) {
414e18a033bSKonstantin Ananyev        /* there are some error logs, but no files */
415e18a033bSKonstantin Ananyev
416e18a033bSKonstantin Ananyev        log = ngx_pcalloc(cycle->pool, sizeof(ngx_log_t));
417e18a033bSKonstantin Ananyev        if (log == NULL) {
418e18a033bSKonstantin Ananyev            return NGX_ERROR;
419e18a033bSKonstantin Ananyev        }
420e18a033bSKonstantin Ananyev
421e18a033bSKonstantin Ananyev    } else {
422