Mercurial > hg > nginx-quic
comparison src/core/ngx_syslog.c @ 9057: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 |
comparison
equal
deleted
inserted
replaced
9056:29adacffdefa | 9057: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 } |