#include <ngx_config.h>
#include <ngx_core.h>
static char *ngx_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
static char *ngx_log_set_levels(ngx_conf_t *cf, ngx_log_t *log);
static void ngx_log_insert(ngx_log_t *log, ngx_log_t *new_log);
#if (NGX_DEBUG)
static void ngx_log_memory_writer(ngx_log_t *log, ngx_uint_t level,
u_char *buf, size_t len);
static void ngx_log_memory_cleanup(void *data);
typedef struct {
u_char *start;
u_char *end;
u_char *pos;
ngx_atomic_t written;
} ngx_log_memory_buf_t;
#endif
static ngx_command_t ngx_errlog_commands[] = …;
static ngx_core_module_t ngx_errlog_module_ctx = …;
ngx_module_t ngx_errlog_module = …;
static ngx_log_t ngx_log;
static ngx_open_file_t ngx_log_file;
ngx_uint_t ngx_use_stderr = …;
static ngx_str_t err_levels[] = …;
static const char *debug_levels[] = …;
#if (NGX_HAVE_VARIADIC_MACROS)
void
ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
const char *fmt, ...)
#else
void
ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
const char *fmt, va_list args)
#endif
{ … }
#if !(NGX_HAVE_VARIADIC_MACROS)
void ngx_cdecl
ngx_log_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
const char *fmt, ...)
{
va_list args;
if (log->log_level >= level) {
va_start(args, fmt);
ngx_log_error_core(level, log, err, fmt, args);
va_end(args);
}
}
void ngx_cdecl
ngx_log_debug_core(ngx_log_t *log, ngx_err_t err, const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
ngx_log_error_core(NGX_LOG_DEBUG, log, err, fmt, args);
va_end(args);
}
#endif
void ngx_cdecl
ngx_log_abort(ngx_err_t err, const char *fmt, ...)
{ … }
void ngx_cdecl
ngx_log_stderr(ngx_err_t err, const char *fmt, ...)
{ … }
u_char *
ngx_log_errno(u_char *buf, u_char *last, ngx_err_t err)
{ … }
ngx_log_t *
ngx_log_init(u_char *prefix, u_char *error_log)
{ … }
ngx_int_t
ngx_log_open_default(ngx_cycle_t *cycle)
{ … }
ngx_int_t
ngx_log_redirect_stderr(ngx_cycle_t *cycle)
{ … }
ngx_log_t *
ngx_log_get_file_log(ngx_log_t *head)
{ … }
static char *
ngx_log_set_levels(ngx_conf_t *cf, ngx_log_t *log)
{ … }
static char *
ngx_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{ … }
char *
ngx_log_set_log(ngx_conf_t *cf, ngx_log_t **head)
{ … }
static void
ngx_log_insert(ngx_log_t *log, ngx_log_t *new_log)
{ … }
#if (NGX_DEBUG)
static void
ngx_log_memory_writer(ngx_log_t *log, ngx_uint_t level, u_char *buf,
size_t len)
{
u_char *p;
size_t avail, written;
ngx_log_memory_buf_t *mem;
mem = log->wdata;
if (mem == NULL) {
return;
}
written = ngx_atomic_fetch_add(&mem->written, len);
p = mem->pos + written % (mem->end - mem->pos);
avail = mem->end - p;
if (avail >= len) {
ngx_memcpy(p, buf, len);
} else {
ngx_memcpy(p, buf, avail);
ngx_memcpy(mem->pos, buf + avail, len - avail);
}
}
static void
ngx_log_memory_cleanup(void *data)
{
ngx_log_t *log = data;
ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "destroy memory log buffer");
log->wdata = NULL;
}
#endif