10Sigor@sysoev.ru 20Sigor@sysoev.ru /* 30Sigor@sysoev.ru * Copyright (C) Igor Sysoev 40Sigor@sysoev.ru * Copyright (C) NGINX, Inc. 50Sigor@sysoev.ru */ 60Sigor@sysoev.ru 70Sigor@sysoev.ru #include <nxt_main.h> 80Sigor@sysoev.ru 90Sigor@sysoev.ru 100Sigor@sysoev.ru nxt_uint_t nxt_debug; 111Sigor@sysoev.ru nxt_uint_t nxt_trace; 121Sigor@sysoev.ru 130Sigor@sysoev.ru 140Sigor@sysoev.ru nxt_log_t nxt_main_log = { 150Sigor@sysoev.ru NXT_LOG_INFO, 160Sigor@sysoev.ru 0, 170Sigor@sysoev.ru nxt_log_handler, 180Sigor@sysoev.ru NULL, 190Sigor@sysoev.ru NULL 200Sigor@sysoev.ru }; 210Sigor@sysoev.ru 220Sigor@sysoev.ru 23*564Svbart@nginx.com nxt_str_t nxt_log_levels[6] = { 240Sigor@sysoev.ru nxt_string("alert"), 250Sigor@sysoev.ru nxt_string("error"), 260Sigor@sysoev.ru nxt_string("warn"), 270Sigor@sysoev.ru nxt_string("notice"), 280Sigor@sysoev.ru nxt_string("info"), 290Sigor@sysoev.ru nxt_string("debug") 300Sigor@sysoev.ru }; 310Sigor@sysoev.ru 320Sigor@sysoev.ru 330Sigor@sysoev.ru static const u_char *nxt_log_prefix; 340Sigor@sysoev.ru 350Sigor@sysoev.ru 360Sigor@sysoev.ru void 370Sigor@sysoev.ru nxt_log_start(const char *prefix) 380Sigor@sysoev.ru { 390Sigor@sysoev.ru if (prefix != NULL && *prefix != '\0') { 400Sigor@sysoev.ru nxt_log_prefix = (u_char *) prefix; 410Sigor@sysoev.ru } 420Sigor@sysoev.ru } 430Sigor@sysoev.ru 440Sigor@sysoev.ru 450Sigor@sysoev.ru /* STUB */ 460Sigor@sysoev.ru nxt_log_t * 470Sigor@sysoev.ru nxt_log_set_ctx(nxt_log_t *log, nxt_log_ctx_handler_t handler, void *ctx) 480Sigor@sysoev.ru { 490Sigor@sysoev.ru nxt_log_t *old; 500Sigor@sysoev.ru nxt_thread_t *thr; 510Sigor@sysoev.ru 520Sigor@sysoev.ru thr = nxt_thread(); 530Sigor@sysoev.ru old = thr->log; 540Sigor@sysoev.ru 550Sigor@sysoev.ru log->level = old->level; 560Sigor@sysoev.ru log->handler = old->handler; 570Sigor@sysoev.ru log->ctx_handler = handler; 580Sigor@sysoev.ru log->ctx = ctx; 590Sigor@sysoev.ru 600Sigor@sysoev.ru thr->log = log; 610Sigor@sysoev.ru 620Sigor@sysoev.ru return old; 630Sigor@sysoev.ru } 640Sigor@sysoev.ru 650Sigor@sysoev.ru 660Sigor@sysoev.ru void nxt_cdecl 670Sigor@sysoev.ru nxt_log_handler(nxt_uint_t level, nxt_log_t *log, const char *fmt, ...) 680Sigor@sysoev.ru { 690Sigor@sysoev.ru u_char *p, *syslogmsg, *end; 700Sigor@sysoev.ru va_list args; 710Sigor@sysoev.ru u_char msg[NXT_MAX_ERROR_STR]; 720Sigor@sysoev.ru 730Sigor@sysoev.ru p = msg; 740Sigor@sysoev.ru end = msg + NXT_MAX_ERROR_STR; 750Sigor@sysoev.ru 760Sigor@sysoev.ru if (nxt_log_prefix != NULL) { 770Sigor@sysoev.ru p = nxt_cpystrn(p, nxt_log_prefix, end - p); 780Sigor@sysoev.ru *p++ = ':'; 790Sigor@sysoev.ru *p++ = ' '; 800Sigor@sysoev.ru } 810Sigor@sysoev.ru 820Sigor@sysoev.ru syslogmsg = p; 830Sigor@sysoev.ru 840Sigor@sysoev.ru p = nxt_sprintf(p, end, (log->ident != 0) ? "[%V] *%D " : "[%V] ", 850Sigor@sysoev.ru &nxt_log_levels[level], log->ident); 860Sigor@sysoev.ru 870Sigor@sysoev.ru va_start(args, fmt); 880Sigor@sysoev.ru p = nxt_vsprintf(p, end, fmt, args); 890Sigor@sysoev.ru va_end(args); 900Sigor@sysoev.ru 910Sigor@sysoev.ru if (level != NXT_LOG_DEBUG && log->ctx_handler != NULL) { 920Sigor@sysoev.ru p = log->ctx_handler(log->ctx, p, end); 930Sigor@sysoev.ru } 940Sigor@sysoev.ru 950Sigor@sysoev.ru if (p > end - NXT_LINEFEED_SIZE) { 960Sigor@sysoev.ru p = end - NXT_LINEFEED_SIZE; 970Sigor@sysoev.ru } 980Sigor@sysoev.ru 990Sigor@sysoev.ru nxt_linefeed(p); 1000Sigor@sysoev.ru 1010Sigor@sysoev.ru (void) nxt_write_console(nxt_stderr, msg, p - msg); 1020Sigor@sysoev.ru 103*564Svbart@nginx.com if (level == NXT_LOG_ALERT) { 1040Sigor@sysoev.ru *(p - NXT_LINEFEED_SIZE) = '\0'; 1050Sigor@sysoev.ru 1060Sigor@sysoev.ru /* 1070Sigor@sysoev.ru * Syslog LOG_ALERT level is enough, because 1080Sigor@sysoev.ru * LOG_EMERG level broadcast a message to all users. 1090Sigor@sysoev.ru */ 1100Sigor@sysoev.ru nxt_write_syslog(LOG_ALERT, syslogmsg); 1110Sigor@sysoev.ru } 1120Sigor@sysoev.ru } 113