diff options
author | Robert Nagy <robert@cvs.openbsd.org> | 2012-10-25 13:02:47 +0000 |
---|---|---|
committer | Robert Nagy <robert@cvs.openbsd.org> | 2012-10-25 13:02:47 +0000 |
commit | f0b30bdb85f9ff76251bd33e795e8960706dffb0 (patch) | |
tree | 320ffdc9a3d71cc0986dd5d11969d6f3657badca /usr.sbin/nginx | |
parent | a98926d6a7de5bbf884d9adb6f4acd002631f06a (diff) |
add syslog support to nginx
Diffstat (limited to 'usr.sbin/nginx')
-rw-r--r-- | usr.sbin/nginx/Makefile.bsd-wrapper | 3 | ||||
-rw-r--r-- | usr.sbin/nginx/README.OpenBSD | 7 | ||||
-rw-r--r-- | usr.sbin/nginx/conf/nginx.conf | 4 | ||||
-rw-r--r-- | usr.sbin/nginx/src/core/ngx_cycle.c | 6 | ||||
-rw-r--r-- | usr.sbin/nginx/src/core/ngx_log.c | 239 | ||||
-rw-r--r-- | usr.sbin/nginx/src/core/ngx_log.h | 18 | ||||
-rw-r--r-- | usr.sbin/nginx/src/http/modules/ngx_http_log_module.c | 120 | ||||
-rw-r--r-- | usr.sbin/nginx/src/http/ngx_http_core_module.c | 53 | ||||
-rw-r--r-- | usr.sbin/nginx/src/http/ngx_http_request.c | 6 |
9 files changed, 452 insertions, 4 deletions
diff --git a/usr.sbin/nginx/Makefile.bsd-wrapper b/usr.sbin/nginx/Makefile.bsd-wrapper index a156b49db5d..4f9edac54b5 100644 --- a/usr.sbin/nginx/Makefile.bsd-wrapper +++ b/usr.sbin/nginx/Makefile.bsd-wrapper @@ -1,5 +1,5 @@ # Build wrapper for Nginx -# $OpenBSD: Makefile.bsd-wrapper,v 1.8 2012/07/12 09:17:40 jasper Exp $ +# $OpenBSD: Makefile.bsd-wrapper,v 1.9 2012/10/25 13:02:46 robert Exp $ LNDIR= /usr/bin/lndir @@ -27,6 +27,7 @@ CONFIGURE_ARGS= --prefix=/var/www \ --with-http_ssl_module \ --with-http_stub_status_module \ --with-ipv6 \ + --with-cc-opt="-DNGX_ENABLE_SYSLOG" \ --without-mail_pop3_module \ --without-mail_imap_module \ --without-mail_smtp_module diff --git a/usr.sbin/nginx/README.OpenBSD b/usr.sbin/nginx/README.OpenBSD index 89aee06bc5f..ec94080f285 100644 --- a/usr.sbin/nginx/README.OpenBSD +++ b/usr.sbin/nginx/README.OpenBSD @@ -9,8 +9,15 @@ Modified files by OpenBSD: - src/core/nginx.c - src/core/ngx_cycle.c - src/core/ngx_file.c +- src/core/ngx_log.c +- src/core/ngx_log.h - src/core/ngx_string.c - src/core/ngx_string.h - src/http/ngx_http_core_module.c +- src/http/ngx_http_request.c +- src/http/modules/ngx_http_log_module.c - src/os/unix/ngx_process_cycle.c - src/os/unix/ngx_process_cycle.h + +The syslog patch has been applied from: +https://github.com/yaoweibin/nginx_syslog_patch diff --git a/usr.sbin/nginx/conf/nginx.conf b/usr.sbin/nginx/conf/nginx.conf index ffc0ef935df..22d507312fa 100644 --- a/usr.sbin/nginx/conf/nginx.conf +++ b/usr.sbin/nginx/conf/nginx.conf @@ -5,6 +5,9 @@ worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; +#error_log syslog:notice|logs/error.log; + +#syslog local6 nginx; #pid logs/nginx.pid; @@ -23,6 +26,7 @@ http { # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; + #access_log syslog:notice|logs/access.log main; #tcp_nopush on; diff --git a/usr.sbin/nginx/src/core/ngx_cycle.c b/usr.sbin/nginx/src/core/ngx_cycle.c index 9334b031115..260a9947f5b 100644 --- a/usr.sbin/nginx/src/core/ngx_cycle.c +++ b/usr.sbin/nginx/src/core/ngx_cycle.c @@ -85,6 +85,12 @@ ngx_init_cycle(ngx_cycle_t *old_cycle) cycle->pool = pool; cycle->log = log; cycle->new_log.log_level = NGX_LOG_ERR; +#if (NGX_ENABLE_SYSLOG) + cycle->new_log.facility = SYSLOG_FACILITY; + cycle->new_log.facility = ERR_SYSLOG_PRIORITY; + cycle->new_log.syslog_on = 0; + cycle->new_log.syslog_set = 0; +#endif cycle->old_cycle = old_cycle; cycle->conf_prefix.len = old_cycle->conf_prefix.len; diff --git a/usr.sbin/nginx/src/core/ngx_log.c b/usr.sbin/nginx/src/core/ngx_log.c index d7830fb4b1b..b0a9733e8bf 100644 --- a/usr.sbin/nginx/src/core/ngx_log.c +++ b/usr.sbin/nginx/src/core/ngx_log.c @@ -10,6 +10,15 @@ static char *ngx_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); +#if (NGX_ENABLE_SYSLOG) +static char *ngx_set_syslog(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); +void log_exit(ngx_cycle_t *cycle); + +typedef struct{ + ngx_str_t name; + ngx_int_t macro; +} ngx_string_to_macro_t; +#endif static ngx_command_t ngx_errlog_commands[] = { @@ -21,6 +30,15 @@ static ngx_command_t ngx_errlog_commands[] = { 0, NULL}, +#if (NGX_ENABLE_SYSLOG) + {ngx_string("syslog"), + NGX_MAIN_CONF|NGX_CONF_TAKE12, + ngx_set_syslog, + 0, + 0, + NULL}, +#endif + ngx_null_command }; @@ -43,7 +61,11 @@ ngx_module_t ngx_errlog_module = { NULL, /* init thread */ NULL, /* exit thread */ NULL, /* exit process */ - NULL, /* exit master */ +#if (NGX_ENABLE_SYSLOG) + log_exit, /* exit master */ +#else + NULL, +#endif NGX_MODULE_V1_PADDING }; @@ -52,6 +74,48 @@ static ngx_log_t ngx_log; static ngx_open_file_t ngx_log_file; ngx_uint_t ngx_use_stderr = 1; +#if (NGX_ENABLE_SYSLOG) +static ngx_string_to_macro_t ngx_syslog_facilities[] = { + {ngx_string("auth"), LOG_AUTH}, +#if !(NGX_SOLARIS) + {ngx_string("authpriv"), LOG_AUTHPRIV}, +#endif + {ngx_string("cron"), LOG_CRON}, + {ngx_string("daemon"), LOG_DAEMON}, +#if !(NGX_SOLARIS) + {ngx_string("ftp"), LOG_FTP}, +#endif + {ngx_string("kern"), LOG_KERN}, + {ngx_string("local0"), LOG_LOCAL0}, + {ngx_string("local1"), LOG_LOCAL1}, + {ngx_string("local2"), LOG_LOCAL2}, + {ngx_string("local3"), LOG_LOCAL3}, + {ngx_string("local4"), LOG_LOCAL4}, + {ngx_string("local5"), LOG_LOCAL5}, + {ngx_string("local6"), LOG_LOCAL6}, + {ngx_string("local7"), LOG_LOCAL7}, + {ngx_string("lpr"), LOG_LPR}, + {ngx_string("mail"), LOG_MAIL}, + {ngx_string("news"), LOG_NEWS}, + {ngx_string("syslog"), LOG_SYSLOG}, + {ngx_string("user"), LOG_USER}, + {ngx_string("uucp"), LOG_UUCP}, + { ngx_null_string, 0} +}; + +static ngx_string_to_macro_t ngx_syslog_priorities[] = { + {ngx_string("emerg"), LOG_EMERG}, + {ngx_string("alert"), LOG_ALERT}, + {ngx_string("crit"), LOG_CRIT}, + {ngx_string("error"), LOG_ERR}, + {ngx_string("err"), LOG_ERR}, + {ngx_string("warn"), LOG_WARNING}, + {ngx_string("notice"),LOG_NOTICE}, + {ngx_string("info"), LOG_INFO}, + {ngx_string("debug"), LOG_DEBUG}, + { ngx_null_string, 0} +}; +#endif static ngx_str_t err_levels[] = { ngx_null_string, @@ -89,11 +153,16 @@ ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, va_list args; #endif u_char *p, *last, *msg; +#if (NGX_ENABLE_SYSLOG) + u_char *errstr_syslog; +#endif u_char errstr[NGX_MAX_ERROR_STR]; +#if !(NGX_ENABLE_SYSLOG) if (log->file->fd == NGX_INVALID_FILE) { return; } +#endif last = errstr + NGX_MAX_ERROR_STR; @@ -102,6 +171,10 @@ ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, p = errstr + ngx_cached_err_log_time.len; +#if (NGX_ENABLE_SYSLOG) + errstr_syslog = p; +#endif + p = ngx_slprintf(p, last, " [%V] ", &err_levels[level]); /* pid#tid */ @@ -140,11 +213,27 @@ ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, ngx_linefeed(p); +#if (NGX_ENABLE_SYSLOG) + if (log->file != NULL && log->file->name.len != 0) { + (void) ngx_write_fd(log->file->fd, errstr, p - errstr); + } + + /* Don't send the debug level info to syslog */ + if (log->syslog_on && level < NGX_LOG_DEBUG) { + /* write to syslog */ + syslog(log->priority, "%.*s", (int)(p - errstr_syslog), errstr_syslog); + } +#else (void) ngx_write_fd(log->file->fd, errstr, p - errstr); +#endif if (!ngx_use_stderr || level > NGX_LOG_WARN +#if (NGX_ENABLE_SYSLOG) + || (log->file != NULL && log->file->fd == ngx_stderr)) +#else || log->file->fd == ngx_stderr) +#endif { return; } @@ -365,6 +454,50 @@ ngx_log_create(ngx_cycle_t *cycle, ngx_str_t *name) return log; } + + +#if (NGX_ENABLE_SYSLOG) +ngx_int_t +ngx_log_get_priority(ngx_conf_t *cf, ngx_str_t *priority) +{ + ngx_int_t p = 0; + ngx_uint_t n, match = 0; + + for (n = 0; ngx_syslog_priorities[n].name.len != 0; n++) { + if (ngx_strncmp(priority->data, ngx_syslog_priorities[n].name.data, + ngx_syslog_priorities[n].name.len) == 0) { + p = ngx_syslog_priorities[n].macro; + match = 1; + } + } + + if (!match) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid syslog priority \"%V\"", priority); + return -1; + } + + return p; +} + + +char * +ngx_log_set_priority(ngx_conf_t *cf, ngx_str_t *priority, ngx_log_t *log) +{ + log->priority = ERR_SYSLOG_PRIORITY; + + if (priority->len == 0) { + return NGX_CONF_OK; + } + + log->priority = ngx_log_get_priority(cf, priority); + if (log->priority == (-1)) { + return NGX_CONF_ERROR; + } + + return NGX_CONF_OK; +} +#endif char * @@ -429,6 +562,13 @@ static char * ngx_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { ngx_str_t *value, name; +#if (NGX_ENABLE_SYSLOG) + u_char *off = NULL; + ngx_str_t priority; + + ngx_str_null(&name); + ngx_str_null(&priority); +#endif if (cf->cycle->new_log.file) { return "is duplicate"; @@ -436,7 +576,44 @@ ngx_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) value = cf->args->elts; +#if (NGX_ENABLE_SYSLOG) + if (ngx_strncmp(value[1].data, "syslog", sizeof("syslog") - 1) == 0) { + if (!cf->cycle->new_log.syslog_set) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "You must set the syslog directive and enable it first."); + return NGX_CONF_ERROR; + } + + cf->cycle->new_log.syslog_on = 1; + + if (value[1].data[sizeof("syslog") - 1] == ':') { + priority.len = value[1].len - sizeof("syslog"); + priority.data = value[1].data + sizeof("syslog"); + + off = (u_char *)ngx_strchr(priority.data, (int) '|'); + if (off != NULL) { + priority.len = off - priority.data; + + off++; + name.len = value[1].data + value[1].len - off; + name.data = off; + } + } + else { + if (value[1].len > sizeof("syslog")) { + name.len = value[1].len - sizeof("syslog"); + name.data = value[1].data + sizeof("syslog"); + } + } + + if (ngx_log_set_priority(cf, &priority, &cf->cycle->new_log) == NGX_CONF_ERROR) { + return NGX_CONF_ERROR; + } + } + else if (ngx_strcmp(value[1].data, "stderr") == 0) { +#else if (ngx_strcmp(value[1].data, "stderr") == 0) { +#endif ngx_str_null(&name); } else { @@ -457,3 +634,63 @@ ngx_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) return ngx_log_set_levels(cf, &cf->cycle->new_log); } + + +#if (NGX_ENABLE_SYSLOG) + +#define SYSLOG_IDENT_NAME "nginx" + +static char * +ngx_set_syslog(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + char *program; + ngx_str_t *value; + ngx_int_t facility, match = 0; + ngx_uint_t n; + + value = cf->args->elts; + + if (cf->cycle->new_log.syslog_set) { + return "is duplicate"; + } + + cf->cycle->new_log.syslog_set = 1; + + for (n = 0; ngx_syslog_facilities[n].name.len != 0; n++) { + if (ngx_strncmp(value[1].data, ngx_syslog_facilities[n].name.data, + ngx_syslog_facilities[n].name.len) == 0) { + facility = ngx_syslog_facilities[n].macro; + match = 1; + break; + } + } + + if (match) { + cf->cycle->new_log.facility = facility; + cf->cycle->new_log.priority = ERR_SYSLOG_PRIORITY; + } + else { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid syslog facility \"%V\"", &value[1]); + return NGX_CONF_ERROR; + } + + program = SYSLOG_IDENT_NAME; + if (cf->args->nelts > 2) { + program = (char *) value[2].data; + } + + openlog(program, LOG_ODELAY, facility); + + return NGX_CONF_OK; +} + + +void log_exit(ngx_cycle_t *cycle) +{ + if (cycle->new_log.syslog_set) { + closelog(); + } +} +#endif + diff --git a/usr.sbin/nginx/src/core/ngx_log.h b/usr.sbin/nginx/src/core/ngx_log.h index 32336478639..5e7fdbf4b4e 100644 --- a/usr.sbin/nginx/src/core/ngx_log.h +++ b/usr.sbin/nginx/src/core/ngx_log.h @@ -12,6 +12,13 @@ #include <ngx_config.h> #include <ngx_core.h> +#if (NGX_ENABLE_SYSLOG) +#include <syslog.h> + +#define SYSLOG_FACILITY LOG_LOCAL5 +#define ERR_SYSLOG_PRIORITY LOG_ERR +#endif + #define NGX_LOG_STDERR 0 #define NGX_LOG_EMERG 1 @@ -61,6 +68,13 @@ struct ngx_log_s { */ char *action; + +#if (NGX_ENABLE_SYSLOG) + ngx_int_t priority; + ngx_int_t facility; + unsigned syslog_on:1; /* unsigned :1 syslog_on */ + unsigned syslog_set:1; /*unsigned :1 syslog_set */ +#endif }; @@ -221,6 +235,10 @@ void ngx_cdecl ngx_log_debug_core(ngx_log_t *log, ngx_err_t err, ngx_log_t *ngx_log_init(u_char *prefix); ngx_log_t *ngx_log_create(ngx_cycle_t *cycle, ngx_str_t *name); +#if (NGX_ENABLE_SYSLOG) +ngx_int_t ngx_log_get_priority(ngx_conf_t *cf, ngx_str_t *priority); +char * ngx_log_set_priority(ngx_conf_t *cf, ngx_str_t *priority, ngx_log_t *log); +#endif char *ngx_log_set_levels(ngx_conf_t *cf, ngx_log_t *log); 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, ...); diff --git a/usr.sbin/nginx/src/http/modules/ngx_http_log_module.c b/usr.sbin/nginx/src/http/modules/ngx_http_log_module.c index 5b9c7998696..5245451c122 100644 --- a/usr.sbin/nginx/src/http/modules/ngx_http_log_module.c +++ b/usr.sbin/nginx/src/http/modules/ngx_http_log_module.c @@ -9,6 +9,11 @@ #include <ngx_core.h> #include <ngx_http.h> +#if (NGX_ENABLE_SYSLOG) +#include <syslog.h> + +#define HTTP_SYSLOG_PRIORITY LOG_NOTICE +#endif typedef struct ngx_http_log_op_s ngx_http_log_op_t; @@ -52,6 +57,11 @@ typedef struct { time_t disk_full_time; time_t error_log_time; ngx_http_log_fmt_t *format; + +#if (NGX_ENABLE_SYSLOG) + ngx_int_t priority; + unsigned syslog_on:1; /* unsigned :1 syslog_on */ +#endif } ngx_http_log_t; @@ -323,11 +333,27 @@ ngx_http_log_write(ngx_http_request_t *r, ngx_http_log_t *log, u_char *buf, time_t now; ssize_t n; ngx_err_t err; - + +#if (NGX_ENABLE_SYSLOG) + n = 0; + if (log->syslog_on) { + syslog(log->priority, "%.*s", (int)len, buf); + } +#endif + if (log->script == NULL) { name = log->file->name.data; +#if (NGX_ENABLE_SYSLOG) + if (name != NULL) { + n = ngx_write_fd(log->file->fd, buf, len); + } + else { + n = len; + } +#else n = ngx_write_fd(log->file->fd, buf, len); +#endif } else { name = NULL; n = ngx_http_log_script_write(r, log->script, &name, buf, len); @@ -856,6 +882,10 @@ ngx_http_log_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) log->script = NULL; log->disk_full_time = 0; log->error_log_time = 0; +#if (NGX_ENABLE_SYSLOG) + log->priority = HTTP_SYSLOG_PRIORITY; + log->syslog_on = 0; +#endif lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_log_module); fmt = lmcf->formats.elts; @@ -881,6 +911,13 @@ ngx_http_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) ngx_http_log_main_conf_t *lmcf; ngx_http_script_compile_t sc; +#if (NGX_ENABLE_SYSLOG) + u_char *off; + ngx_str_t priority; + ngx_uint_t syslog_on = 0; + name = priority = (ngx_str_t)ngx_null_string; +#endif + value = cf->args->elts; if (ngx_strcmp(value[1].data, "off") == 0) { @@ -893,6 +930,38 @@ ngx_http_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) "invalid parameter \"%V\"", &value[2]); return NGX_CONF_ERROR; } +#if (NGX_ENABLE_SYSLOG) + else if (ngx_strncmp(value[1].data, "syslog", sizeof("syslog") - 1) == 0) { + if (!cf->cycle->new_log.syslog_set) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "You must set the syslog directive and enable it first."); + return NGX_CONF_ERROR; + } + + syslog_on = 1; + if (value[1].data[sizeof("syslog") - 1] == ':') { + priority.len = value[1].len - sizeof("syslog"); + priority.data = value[1].data + sizeof("syslog"); + + off = (u_char*) ngx_strchr(priority.data, '|'); + if (off != NULL) { + priority.len = off - priority.data; + + off++; + name.len = value[1].data + value[1].len - off; + name.data = off; + } + } + else { + if (value[1].len > sizeof("syslog")) { + name.len = value[1].len - sizeof("syslog"); + name.data = value[1].data + sizeof("syslog"); + } + } + } else { + name = value[1]; + } +#endif if (llcf->logs == NULL) { llcf->logs = ngx_array_create(cf->pool, 2, sizeof(ngx_http_log_t)); @@ -910,6 +979,52 @@ ngx_http_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) ngx_memzero(log, sizeof(ngx_http_log_t)); +#if (NGX_ENABLE_SYSLOG) + log->syslog_on = syslog_on; + + if (priority.len == 0) { + log->priority = HTTP_SYSLOG_PRIORITY; + } + else { + log->priority = ngx_log_get_priority(cf, &priority); + } + + if (name.len != 0) { + n = ngx_http_script_variables_count(&name); + + if (n == 0) { + log->file = ngx_conf_open_file(cf->cycle, &name); + if (log->file == NULL) { + return NGX_CONF_ERROR; + } + } else { + if (ngx_conf_full_name(cf->cycle, &name, 0) != NGX_OK) { + return NGX_CONF_ERROR; + } + log->script = ngx_pcalloc(cf->pool, sizeof(ngx_http_log_script_t)); + if (log->script == NULL) { + return NGX_CONF_ERROR; + } + ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); + sc.cf = cf; + sc.source = &name; + sc.lengths = &log->script->lengths; + sc.values = &log->script->values; + sc.variables = n; + sc.complete_lengths = 1; + sc.complete_values = 1; + if (ngx_http_script_compile(&sc) != NGX_OK) { + return NGX_CONF_ERROR; + } + } + } + else { + log->file = ngx_conf_open_file(cf->cycle, &name); + if (log->file == NULL) { + return NGX_CONF_ERROR; + } + } +#else n = ngx_http_script_variables_count(&value[1]); if (n == 0) { @@ -917,7 +1032,7 @@ ngx_http_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) if (log->file == NULL) { return NGX_CONF_ERROR; } - + } else { if (ngx_conf_full_name(cf->cycle, &value[1], 0) != NGX_OK) { return NGX_CONF_ERROR; @@ -942,6 +1057,7 @@ ngx_http_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) return NGX_CONF_ERROR; } } +#endif if (cf->args->nelts >= 3) { name = value[2]; diff --git a/usr.sbin/nginx/src/http/ngx_http_core_module.c b/usr.sbin/nginx/src/http/ngx_http_core_module.c index 3c28e7e33f9..c90f123d64d 100644 --- a/usr.sbin/nginx/src/http/ngx_http_core_module.c +++ b/usr.sbin/nginx/src/http/ngx_http_core_module.c @@ -1450,6 +1450,9 @@ ngx_http_update_location_config(ngx_http_request_t *r) if (r == r->main) { r->connection->log->file = clcf->error_log->file; +#if (NGX_ENABLE_SYSLOG) + r->connection->log->priority = clcf->error_log->priority; +#endif if (!(r->connection->log->log_level & NGX_LOG_DEBUG_CONNECTION)) { r->connection->log->log_level = clcf->error_log->log_level; @@ -4767,6 +4770,15 @@ ngx_http_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) ngx_str_t *value, name; +#if (NGX_ENABLE_SYSLOG) + u_char *off = NULL; + ngx_int_t syslog_on = 0; + ngx_str_t priority; + + name = priority = (ngx_str_t) ngx_null_string; +#endif + + if (clcf->error_log) { return "is duplicate"; } @@ -4776,6 +4788,36 @@ ngx_http_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) if (ngx_strcmp(value[1].data, "stderr") == 0) { ngx_str_null(&name); +#if (NGX_ENABLE_SYSLOG) + } else if (ngx_strncmp(value[1].data, "syslog", sizeof("syslog") - 1) == 0) { + if (!cf->cycle->new_log.syslog_set) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "You must set the syslog directive and enable it first."); + return NGX_CONF_ERROR; + } + + syslog_on = 1; + + if (value[1].data[sizeof("syslog") - 1] == ':') { + priority.len = value[1].len - sizeof("syslog"); + priority.data = value[1].data + sizeof("syslog"); + + off = (u_char*) ngx_strchr(priority.data, '|'); + if (off != NULL) { + priority.len = off - priority.data; + + off++; + name.len = value[1].data + value[1].len - off; + name.data = off; + } + } + else { + if (value[1].len > sizeof("syslog")) { + name.len = value[1].len - sizeof("syslog"); + name.data = value[1].data + sizeof("syslog"); + } + } +#endif } else { name = value[1]; } @@ -4785,6 +4827,17 @@ ngx_http_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) return NGX_CONF_ERROR; } +#if (NGX_ENABLE_SYSLOG) + if (syslog_on) { + clcf->error_log->syslog_on = 1; + if (ngx_log_set_priority(cf, &priority, clcf->error_log) == NGX_CONF_ERROR) { + return NGX_CONF_ERROR; + } + } + + clcf->error_log->log_level = 0; +#endif + if (cf->args->nelts == 2) { clcf->error_log->log_level = NGX_LOG_ERR; return NGX_CONF_OK; diff --git a/usr.sbin/nginx/src/http/ngx_http_request.c b/usr.sbin/nginx/src/http/ngx_http_request.c index c104db1c0c6..b2515ab947b 100644 --- a/usr.sbin/nginx/src/http/ngx_http_request.c +++ b/usr.sbin/nginx/src/http/ngx_http_request.c @@ -433,6 +433,9 @@ ngx_http_init_request(ngx_event_t *rev) clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); c->log->file = clcf->error_log->file; +#if (NGX_ENABLE_SYSLOG) + c->log->priority = clcf->error_log->priority; +#endif if (!(c->log->log_level & NGX_LOG_DEBUG_CONNECTION)) { c->log->log_level = clcf->error_log->log_level; } @@ -1832,6 +1835,9 @@ found: clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); r->connection->log->file = clcf->error_log->file; +#if (NGX_ENABLE_SYSLOG) + r->connection->log->priority = clcf->error_log->priority; +#endif if (!(r->connection->log->log_level & NGX_LOG_DEBUG_CONNECTION)) { r->connection->log->log_level = clcf->error_log->log_level; |