comparison src/core/ngx_syslog.c @ 8150:8771d35d55d0

Syslog: introduced error log handler. This ensures that errors which happen during logging to syslog are logged with proper context, such as "while logging to syslog" and the server name. Prodded by Safar Safarly.
author Maxim Dounin <mdounin@mdounin.ru>
date Fri, 10 Mar 2023 07:43:50 +0300
parents 29adacffdefa
children c7c8354f99fa
comparison
equal deleted inserted replaced
8149:29adacffdefa 8150:8771d35d55d0
16 16
17 17
18 static char *ngx_syslog_parse_args(ngx_conf_t *cf, ngx_syslog_peer_t *peer); 18 static char *ngx_syslog_parse_args(ngx_conf_t *cf, ngx_syslog_peer_t *peer);
19 static ngx_int_t ngx_syslog_init_peer(ngx_syslog_peer_t *peer); 19 static ngx_int_t ngx_syslog_init_peer(ngx_syslog_peer_t *peer);
20 static void ngx_syslog_cleanup(void *data); 20 static void ngx_syslog_cleanup(void *data);
21 static u_char *ngx_syslog_log_error(ngx_log_t *log, u_char *buf, size_t len);
21 22
22 23
23 static char *facilities[] = { 24 static char *facilities[] = {
24 "kern", "user", "mail", "daemon", "auth", "intern", "lpr", "news", "uucp", 25 "kern", "user", "mail", "daemon", "auth", "intern", "lpr", "news", "uucp",
25 "clock", "authpriv", "ftp", "ntp", "audit", "alert", "cron", "local0", 26 "clock", "authpriv", "ftp", "ntp", "audit", "alert", "cron", "local0",
65 if (peer->tag.data == NULL) { 66 if (peer->tag.data == NULL) {
66 ngx_str_set(&peer->tag, "nginx"); 67 ngx_str_set(&peer->tag, "nginx");
67 } 68 }
68 69
69 peer->hostname = &cf->cycle->hostname; 70 peer->hostname = &cf->cycle->hostname;
70 peer->log = &cf->cycle->new_log; 71 peer->logp = &cf->cycle->new_log;
71 72
72 peer->conn.fd = (ngx_socket_t) -1; 73 peer->conn.fd = (ngx_socket_t) -1;
73 74
74 peer->conn.read = &ngx_syslog_dummy_event; 75 peer->conn.read = &ngx_syslog_dummy_event;
75 peer->conn.write = &ngx_syslog_dummy_event; 76 peer->conn.write = &ngx_syslog_dummy_event;
287 ssize_t 288 ssize_t
288 ngx_syslog_send(ngx_syslog_peer_t *peer, u_char *buf, size_t len) 289 ngx_syslog_send(ngx_syslog_peer_t *peer, u_char *buf, size_t len)
289 { 290 {
290 ssize_t n; 291 ssize_t n;
291 292
293 if (peer->log.handler == NULL) {
294 peer->log = *peer->logp;
295 peer->log.handler = ngx_syslog_log_error;
296 peer->log.data = peer;
297 peer->log.action = "logging to syslog";
298 }
299
292 if (peer->conn.fd == (ngx_socket_t) -1) { 300 if (peer->conn.fd == (ngx_socket_t) -1) {
293 if (ngx_syslog_init_peer(peer) != NGX_OK) { 301 if (ngx_syslog_init_peer(peer) != NGX_OK) {
294 return NGX_ERROR; 302 return NGX_ERROR;
295 } 303 }
296 } 304 }
304 } 312 }
305 313
306 if (n == NGX_ERROR) { 314 if (n == NGX_ERROR) {
307 315
308 if (ngx_close_socket(peer->conn.fd) == -1) { 316 if (ngx_close_socket(peer->conn.fd) == -1) {
309 ngx_log_error(NGX_LOG_ALERT, peer->log, ngx_socket_errno, 317 ngx_log_error(NGX_LOG_ALERT, &peer->log, ngx_socket_errno,
310 ngx_close_socket_n " failed"); 318 ngx_close_socket_n " failed");
311 } 319 }
312 320
313 peer->conn.fd = (ngx_socket_t) -1; 321 peer->conn.fd = (ngx_socket_t) -1;
314 } 322 }
322 { 330 {
323 ngx_socket_t fd; 331 ngx_socket_t fd;
324 332
325 fd = ngx_socket(peer->server.sockaddr->sa_family, SOCK_DGRAM, 0); 333 fd = ngx_socket(peer->server.sockaddr->sa_family, SOCK_DGRAM, 0);
326 if (fd == (ngx_socket_t) -1) { 334 if (fd == (ngx_socket_t) -1) {
327 ngx_log_error(NGX_LOG_ALERT, peer->log, ngx_socket_errno, 335 ngx_log_error(NGX_LOG_ALERT, &peer->log, ngx_socket_errno,
328 ngx_socket_n " failed"); 336 ngx_socket_n " failed");
329 return NGX_ERROR; 337 return NGX_ERROR;
330 } 338 }
331 339
332 if (ngx_nonblocking(fd) == -1) { 340 if (ngx_nonblocking(fd) == -1) {
333 ngx_log_error(NGX_LOG_ALERT, peer->log, ngx_socket_errno, 341 ngx_log_error(NGX_LOG_ALERT, &peer->log, ngx_socket_errno,
334 ngx_nonblocking_n " failed"); 342 ngx_nonblocking_n " failed");
335 goto failed; 343 goto failed;
336 } 344 }
337 345
338 if (connect(fd, peer->server.sockaddr, peer->server.socklen) == -1) { 346 if (connect(fd, peer->server.sockaddr, peer->server.socklen) == -1) {
339 ngx_log_error(NGX_LOG_ALERT, peer->log, ngx_socket_errno, 347 ngx_log_error(NGX_LOG_ALERT, &peer->log, ngx_socket_errno,
340 "connect() failed"); 348 "connect() failed");
341 goto failed; 349 goto failed;
342 } 350 }
343 351
344 peer->conn.fd = fd; 352 peer->conn.fd = fd;
345 peer->conn.log = peer->log; 353 peer->conn.log = &peer->log;
346 354
347 /* UDP sockets are always ready to write */ 355 /* UDP sockets are always ready to write */
348 peer->conn.write->ready = 1; 356 peer->conn.write->ready = 1;
349 357
350 return NGX_OK; 358 return NGX_OK;
351 359
352 failed: 360 failed:
353 361
354 if (ngx_close_socket(fd) == -1) { 362 if (ngx_close_socket(fd) == -1) {
355 ngx_log_error(NGX_LOG_ALERT, peer->log, ngx_socket_errno, 363 ngx_log_error(NGX_LOG_ALERT, &peer->log, ngx_socket_errno,
356 ngx_close_socket_n " failed"); 364 ngx_close_socket_n " failed");
357 } 365 }
358 366
359 return NGX_ERROR; 367 return NGX_ERROR;
360 } 368 }
371 if (peer->conn.fd == (ngx_socket_t) -1) { 379 if (peer->conn.fd == (ngx_socket_t) -1) {
372 return; 380 return;
373 } 381 }
374 382
375 if (ngx_close_socket(peer->conn.fd) == -1) { 383 if (ngx_close_socket(peer->conn.fd) == -1) {
376 ngx_log_error(NGX_LOG_ALERT, peer->log, ngx_socket_errno, 384 ngx_log_error(NGX_LOG_ALERT, &peer->log, ngx_socket_errno,
377 ngx_close_socket_n " failed"); 385 ngx_close_socket_n " failed");
378 } 386 }
379 } 387 }
388
389
390 static u_char *
391 ngx_syslog_log_error(ngx_log_t *log, u_char *buf, size_t len)
392 {
393 u_char *p;
394 ngx_syslog_peer_t *peer;
395
396 p = buf;
397
398 if (log->action) {
399 p = ngx_snprintf(buf, len, " while %s", log->action);
400 len -= p - buf;
401 }
402
403 peer = log->data;
404
405 if (peer) {
406 p = ngx_snprintf(p, len, ", server: %V", &peer->server.name);
407 }
408
409 return p;
410 }