xref: /unit/src/nxt_log.c (revision 564)
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