115 lines
2.1 KiB
C
115 lines
2.1 KiB
C
|
|
/*
|
|
* Copyright (C) Igor Sysoev
|
|
* Copyright (C) NGINX, Inc.
|
|
*/
|
|
|
|
#include <nxt_main.h>
|
|
|
|
|
|
nxt_uint_t nxt_debug;
|
|
nxt_uint_t nxt_trace;
|
|
|
|
|
|
nxt_log_t nxt_main_log = {
|
|
NXT_LOG_INFO,
|
|
0,
|
|
nxt_log_handler,
|
|
NULL,
|
|
NULL
|
|
};
|
|
|
|
|
|
nxt_str_t nxt_log_levels[8] = {
|
|
nxt_string("emerg"),
|
|
nxt_string("alert"),
|
|
nxt_string("crit"),
|
|
nxt_string("error"),
|
|
nxt_string("warn"),
|
|
nxt_string("notice"),
|
|
nxt_string("info"),
|
|
nxt_string("debug")
|
|
};
|
|
|
|
|
|
static const u_char *nxt_log_prefix;
|
|
|
|
|
|
void
|
|
nxt_log_start(const char *prefix)
|
|
{
|
|
if (prefix != NULL && *prefix != '\0') {
|
|
nxt_log_prefix = (u_char *) prefix;
|
|
}
|
|
}
|
|
|
|
|
|
/* STUB */
|
|
nxt_log_t *
|
|
nxt_log_set_ctx(nxt_log_t *log, nxt_log_ctx_handler_t handler, void *ctx)
|
|
{
|
|
nxt_log_t *old;
|
|
nxt_thread_t *thr;
|
|
|
|
thr = nxt_thread();
|
|
old = thr->log;
|
|
|
|
log->level = old->level;
|
|
log->handler = old->handler;
|
|
log->ctx_handler = handler;
|
|
log->ctx = ctx;
|
|
|
|
thr->log = log;
|
|
|
|
return old;
|
|
}
|
|
|
|
|
|
void nxt_cdecl
|
|
nxt_log_handler(nxt_uint_t level, nxt_log_t *log, const char *fmt, ...)
|
|
{
|
|
u_char *p, *syslogmsg, *end;
|
|
va_list args;
|
|
u_char msg[NXT_MAX_ERROR_STR];
|
|
|
|
p = msg;
|
|
end = msg + NXT_MAX_ERROR_STR;
|
|
|
|
if (nxt_log_prefix != NULL) {
|
|
p = nxt_cpystrn(p, nxt_log_prefix, end - p);
|
|
*p++ = ':';
|
|
*p++ = ' ';
|
|
}
|
|
|
|
syslogmsg = p;
|
|
|
|
p = nxt_sprintf(p, end, (log->ident != 0) ? "[%V] *%D " : "[%V] ",
|
|
&nxt_log_levels[level], log->ident);
|
|
|
|
va_start(args, fmt);
|
|
p = nxt_vsprintf(p, end, fmt, args);
|
|
va_end(args);
|
|
|
|
if (level != NXT_LOG_DEBUG && log->ctx_handler != NULL) {
|
|
p = log->ctx_handler(log->ctx, p, end);
|
|
}
|
|
|
|
if (p > end - NXT_LINEFEED_SIZE) {
|
|
p = end - NXT_LINEFEED_SIZE;
|
|
}
|
|
|
|
nxt_linefeed(p);
|
|
|
|
(void) nxt_write_console(nxt_stderr, msg, p - msg);
|
|
|
|
if (level <= NXT_LOG_ALERT) {
|
|
*(p - NXT_LINEFEED_SIZE) = '\0';
|
|
|
|
/*
|
|
* Syslog LOG_ALERT level is enough, because
|
|
* LOG_EMERG level broadcast a message to all users.
|
|
*/
|
|
nxt_write_syslog(LOG_ALERT, syslogmsg);
|
|
}
|
|
}
|