Mercurial > hg > nginx
comparison src/core/ngx_log.c @ 5702:777202558122
Added syslog support for error_log and access_log directives.
author | Vladimir Homutov <vl@nginx.com> |
---|---|
date | Mon, 12 May 2014 16:34:15 +0400 |
parents | e088695737c3 |
children | c3b08217f2a2 |
comparison
equal
deleted
inserted
replaced
5701:1209b8a7b077 | 5702:777202558122 |
---|---|
146 | 146 |
147 if (log->log_level < level && !debug_connection) { | 147 if (log->log_level < level && !debug_connection) { |
148 break; | 148 break; |
149 } | 149 } |
150 | 150 |
151 if (log->writer) { | |
152 log->writer(log, level, errstr, p - errstr); | |
153 log = log->next; | |
154 continue; | |
155 } | |
156 | |
151 (void) ngx_write_fd(log->file->fd, errstr, p - errstr); | 157 (void) ngx_write_fd(log->file->fd, errstr, p - errstr); |
152 | 158 |
153 if (log->file->fd == ngx_stderr) { | 159 if (log->file->fd == ngx_stderr) { |
154 wrote_stderr = 1; | 160 wrote_stderr = 1; |
155 } | 161 } |
364 | 370 |
365 | 371 |
366 ngx_int_t | 372 ngx_int_t |
367 ngx_log_open_default(ngx_cycle_t *cycle) | 373 ngx_log_open_default(ngx_cycle_t *cycle) |
368 { | 374 { |
369 static ngx_str_t error_log = ngx_string(NGX_ERROR_LOG_PATH); | 375 ngx_log_t *log; |
370 | 376 static ngx_str_t error_log = ngx_string(NGX_ERROR_LOG_PATH); |
371 if (cycle->new_log.file == NULL) { | 377 |
372 cycle->new_log.file = ngx_conf_open_file(cycle, &error_log); | 378 if (ngx_log_get_file_log(&cycle->new_log) != NULL) { |
373 if (cycle->new_log.file == NULL) { | 379 return NGX_OK; |
380 } | |
381 | |
382 if (cycle->new_log.log_level != 0) { | |
383 /* there are some error logs, but no files */ | |
384 | |
385 log = ngx_pcalloc(cycle->pool, sizeof(ngx_log_t)); | |
386 if (log == NULL) { | |
374 return NGX_ERROR; | 387 return NGX_ERROR; |
375 } | 388 } |
376 | 389 |
377 cycle->new_log.log_level = NGX_LOG_ERR; | 390 log->log_level = NGX_LOG_ERR; |
391 ngx_log_insert(&cycle->new_log, log); | |
392 | |
393 } else { | |
394 /* no error logs at all */ | |
395 log = &cycle->new_log; | |
396 log->log_level = NGX_LOG_ERR; | |
397 } | |
398 | |
399 log->file = ngx_conf_open_file(cycle, &error_log); | |
400 if (log->file == NULL) { | |
401 return NGX_ERROR; | |
378 } | 402 } |
379 | 403 |
380 return NGX_OK; | 404 return NGX_OK; |
381 } | 405 } |
382 | 406 |
388 | 412 |
389 if (cycle->log_use_stderr) { | 413 if (cycle->log_use_stderr) { |
390 return NGX_OK; | 414 return NGX_OK; |
391 } | 415 } |
392 | 416 |
393 fd = cycle->log->file->fd; | 417 /* file log always exists when we are called */ |
418 fd = ngx_log_get_file_log(cycle->log)->file->fd; | |
394 | 419 |
395 if (fd != ngx_stderr) { | 420 if (fd != ngx_stderr) { |
396 if (ngx_set_stderr(fd) == NGX_FILE_ERROR) { | 421 if (ngx_set_stderr(fd) == NGX_FILE_ERROR) { |
397 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | 422 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, |
398 ngx_set_stderr_n " failed"); | 423 ngx_set_stderr_n " failed"); |
400 return NGX_ERROR; | 425 return NGX_ERROR; |
401 } | 426 } |
402 } | 427 } |
403 | 428 |
404 return NGX_OK; | 429 return NGX_OK; |
430 } | |
431 | |
432 | |
433 ngx_log_t * | |
434 ngx_log_get_file_log(ngx_log_t *head) | |
435 { | |
436 ngx_log_t *log; | |
437 | |
438 for (log = head; log; log = log->next) { | |
439 if (log->file != NULL) { | |
440 return log; | |
441 } | |
442 } | |
443 | |
444 return NULL; | |
405 } | 445 } |
406 | 446 |
407 | 447 |
408 static char * | 448 static char * |
409 ngx_log_set_levels(ngx_conf_t *cf, ngx_log_t *log) | 449 ngx_log_set_levels(ngx_conf_t *cf, ngx_log_t *log) |
480 | 520 |
481 | 521 |
482 char * | 522 char * |
483 ngx_log_set_log(ngx_conf_t *cf, ngx_log_t **head) | 523 ngx_log_set_log(ngx_conf_t *cf, ngx_log_t **head) |
484 { | 524 { |
485 ngx_log_t *new_log; | 525 ngx_log_t *new_log; |
486 ngx_str_t *value, name; | 526 ngx_str_t *value, name; |
527 ngx_syslog_peer_t *peer; | |
487 | 528 |
488 if (*head != NULL && (*head)->log_level == 0) { | 529 if (*head != NULL && (*head)->log_level == 0) { |
489 new_log = *head; | 530 new_log = *head; |
490 | 531 |
491 } else { | 532 } else { |
504 | 545 |
505 if (ngx_strcmp(value[1].data, "stderr") == 0) { | 546 if (ngx_strcmp(value[1].data, "stderr") == 0) { |
506 ngx_str_null(&name); | 547 ngx_str_null(&name); |
507 cf->cycle->log_use_stderr = 1; | 548 cf->cycle->log_use_stderr = 1; |
508 | 549 |
550 new_log->file = ngx_conf_open_file(cf->cycle, &name); | |
551 if (new_log->file == NULL) { | |
552 return NGX_CONF_ERROR; | |
553 } | |
554 | |
555 | |
556 } else if (ngx_strncmp(value[1].data, "syslog:", 7) == 0) { | |
557 peer = ngx_pcalloc(cf->pool, sizeof(ngx_syslog_peer_t)); | |
558 if (peer == NULL) { | |
559 return NGX_CONF_ERROR; | |
560 } | |
561 | |
562 if (ngx_syslog_process_conf(cf, peer) != NGX_CONF_OK) { | |
563 return NGX_CONF_ERROR; | |
564 } | |
565 | |
566 new_log->writer = ngx_syslog_writer; | |
567 new_log->wdata = peer; | |
568 | |
509 } else { | 569 } else { |
510 name = value[1]; | 570 new_log->file = ngx_conf_open_file(cf->cycle, &value[1]); |
511 } | 571 if (new_log->file == NULL) { |
512 | 572 return NGX_CONF_ERROR; |
513 new_log->file = ngx_conf_open_file(cf->cycle, &name); | 573 } |
514 if (new_log->file == NULL) { | |
515 return NGX_CONF_ERROR; | |
516 } | 574 } |
517 | 575 |
518 if (ngx_log_set_levels(cf, new_log) != NGX_CONF_OK) { | 576 if (ngx_log_set_levels(cf, new_log) != NGX_CONF_OK) { |
519 return NGX_CONF_ERROR; | 577 return NGX_CONF_ERROR; |
520 } | 578 } |