From 9533a703819dd5fc516a7443d20e41d4af474aff Mon Sep 17 00:00:00 2001 From: Emeric Brun Date: Fri, 2 Apr 2021 10:13:43 +0200 Subject: [PATCH] MINOR: log: register config file and line number on log servers. This patch registers the parsed file and the line where a log server is declared to make those information available in configuration post check. Those new informations were added on error messages probed resolving ring names on post configuration check. --- include/haproxy/log-t.h | 4 ++++ include/haproxy/log.h | 2 +- src/cfgparse-global.c | 2 +- src/cfgparse-listen.c | 2 +- src/cfgparse.c | 2 +- src/fcgi-app.c | 2 +- src/flt_spoe.c | 2 +- src/log.c | 15 +++++++++++---- src/sink.c | 6 +++--- 9 files changed, 24 insertions(+), 13 deletions(-) diff --git a/include/haproxy/log-t.h b/include/haproxy/log-t.h index 9146b77ba2..039621a34e 100644 --- a/include/haproxy/log-t.h +++ b/include/haproxy/log-t.h @@ -237,6 +237,10 @@ struct logsrv { int minlvl; int maxlen; struct logsrv *ref; + struct { + char *file; /* file where the logsrv appears */ + int line; /* line where the logsrv appears */ + } conf; __decl_thread(HA_SPINLOCK_T lock); }; diff --git a/include/haproxy/log.h b/include/haproxy/log.h index 837ae0ccc7..8bd448697e 100644 --- a/include/haproxy/log.h +++ b/include/haproxy/log.h @@ -86,7 +86,7 @@ int add_to_logformat_list(char *start, char *end, int type, struct list *list_fo int parse_logformat_string(const char *str, struct proxy *curproxy, struct list *list_format, int options, int cap, char **err); /* Parse "log" keyword and update the linked list. */ -int parse_logsrv(char **args, struct list *logsrvs, int do_del, char **err); +int parse_logsrv(char **args, struct list *logsrvs, int do_del, const char *file, int linenum, char **err); /* * This function adds a header to the message and sends the syslog message diff --git a/src/cfgparse-global.c b/src/cfgparse-global.c index e0762478bb..79058c65f0 100644 --- a/src/cfgparse-global.c +++ b/src/cfgparse-global.c @@ -904,7 +904,7 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm) } } else if (strcmp(args[0], "log") == 0) { /* "no log" or "log ..." */ - if (!parse_logsrv(args, &global.logsrvs, (kwm == KWM_NO), &errmsg)) { + if (!parse_logsrv(args, &global.logsrvs, (kwm == KWM_NO), file, linenum, &errmsg)) { ha_alert("parsing [%s:%d] : %s : %s\n", file, linenum, args[0], errmsg); err_code |= ERR_ALERT | ERR_FATAL; goto out; diff --git a/src/cfgparse-listen.c b/src/cfgparse-listen.c index 739dc8326d..49a6d14d4c 100644 --- a/src/cfgparse-listen.c +++ b/src/cfgparse-listen.c @@ -2690,7 +2690,7 @@ stats_error_parsing: } } else if (strcmp(args[0], "log") == 0) { /* "no log" or "log ..." */ - if (!parse_logsrv(args, &curproxy->logsrvs, (kwm == KWM_NO), &errmsg)) { + if (!parse_logsrv(args, &curproxy->logsrvs, (kwm == KWM_NO), file, linenum, &errmsg)) { ha_alert("parsing [%s:%d] : %s : %s\n", file, linenum, args[0], errmsg); err_code |= ERR_ALERT | ERR_FATAL; goto out; diff --git a/src/cfgparse.c b/src/cfgparse.c index 8f612ee3c8..47f04e5fc5 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -730,7 +730,7 @@ int cfg_parse_peers(const char *file, int linenum, char **args, int kwm) err_code |= ERR_ALERT | ERR_ABORT; goto out; } - if (!parse_logsrv(args, &curpeers->peers_fe->logsrvs, (kwm == KWM_NO), &errmsg)) { + if (!parse_logsrv(args, &curpeers->peers_fe->logsrvs, (kwm == KWM_NO), file, linenum, &errmsg)) { ha_alert("parsing [%s:%d] : %s : %s\n", file, linenum, args[0], errmsg); err_code |= ERR_ALERT | ERR_FATAL; goto out; diff --git a/src/fcgi-app.c b/src/fcgi-app.c index 61f904dafc..a1b6e68c5a 100644 --- a/src/fcgi-app.c +++ b/src/fcgi-app.c @@ -1056,7 +1056,7 @@ static int cfg_parse_fcgi_app(const char *file, int linenum, char **args, int kw } } else if (strcmp(args[0], "log-stderr") == 0) { - if (!parse_logsrv(args, &curapp->logsrvs, (kwm == KWM_NO), &errmsg)) { + if (!parse_logsrv(args, &curapp->logsrvs, (kwm == KWM_NO), file, linenum, &errmsg)) { ha_alert("parsing [%s:%d] : %s : %s\n", file, linenum, args[0], errmsg); err_code |= ERR_ALERT | ERR_FATAL; } diff --git a/src/flt_spoe.c b/src/flt_spoe.c index 5688ca9918..83f6074f4d 100644 --- a/src/flt_spoe.c +++ b/src/flt_spoe.c @@ -3773,7 +3773,7 @@ cfg_parse_spoe_agent(const char *file, int linenum, char **args, int kwm) else if (strcmp(args[0], "log") == 0) { char *errmsg = NULL; - if (!parse_logsrv(args, &curlogsrvs, (kwm == 1), &errmsg)) { + if (!parse_logsrv(args, &curlogsrvs, (kwm == 1), file, linenum, &errmsg)) { ha_alert("parsing [%s:%d] : %s : %s\n", file, linenum, args[0], errmsg); err_code |= ERR_ALERT | ERR_FATAL; goto out; diff --git a/src/log.c b/src/log.c index 292eb588a8..c8cdafab07 100644 --- a/src/log.c +++ b/src/log.c @@ -808,7 +808,7 @@ int smp_log_range_cmp(const void *a, const void *b) * The function returns 1 in success case, otherwise, it returns 0 and err is * filled. */ -int parse_logsrv(char **args, struct list *logsrvs, int do_del, char **err) +int parse_logsrv(char **args, struct list *logsrvs, int do_del, const char *file, int linenum, char **err) { struct smp_log_range *smp_rgs = NULL; struct sockaddr_storage *sk; @@ -858,6 +858,8 @@ int parse_logsrv(char **args, struct list *logsrvs, int do_del, char **err) node->ref = logsrv; LIST_INIT(&node->list); LIST_ADDQ(logsrvs, &node->list); + node->conf.file = strdup(file); + node->conf.line = linenum; skip_logsrv: continue; @@ -886,6 +888,9 @@ int parse_logsrv(char **args, struct list *logsrvs, int do_del, char **err) goto error; } + logsrv->conf.file = strdup(file); + logsrv->conf.line = linenum; + /* skip address for now, it will be parsed at the end */ cur_arg = 2; @@ -1040,18 +1045,20 @@ int parse_logsrv(char **args, struct list *logsrvs, int do_del, char **err) logsrv->addr = *sk; if (sk->ss_family == AF_INET || sk->ss_family == AF_INET6) { - logsrv->addr = *sk; if (!port1) set_host_port(&logsrv->addr, SYSLOG_PORT); } + done: LIST_ADDQ(logsrvs, &logsrv->list); return 1; error: free(smp_rgs); - if (logsrv) + if (logsrv) { + free(logsrv->conf.file); free(logsrv->ring_name); + } free(logsrv); return 0; } @@ -4062,7 +4069,7 @@ int cfg_parse_log_forward(const char *file, int linenum, char **args, int kwm) } } else if (strcmp(args[0], "log") == 0) { - if (!parse_logsrv(args, &cfg_log_forward->logsrvs, (kwm == KWM_NO), &errmsg)) { + if (!parse_logsrv(args, &cfg_log_forward->logsrvs, (kwm == KWM_NO), file, linenum, &errmsg)) { ha_alert("parsing [%s:%d] : %s : %s\n", file, linenum, args[0], errmsg); err_code |= ERR_ALERT | ERR_FATAL; goto out; diff --git a/src/sink.c b/src/sink.c index f734b07c93..5d43525cf8 100644 --- a/src/sink.c +++ b/src/sink.c @@ -993,7 +993,7 @@ int post_sink_resolve() if (logsrv->type == LOG_TARGET_BUFFER) { sink = sink_find(logsrv->ring_name); if (!sink || sink->type != SINK_TYPE_BUFFER) { - ha_alert("global log server uses unknown ring named '%s'.\n", logsrv->ring_name); + ha_alert("global log server declared in file '%s' at line %d uses unknown ring named '%s'.\n", logsrv->conf.file, logsrv->conf.line, logsrv->ring_name); err_code |= ERR_ALERT | ERR_FATAL; } logsrv->sink = sink; @@ -1005,7 +1005,7 @@ int post_sink_resolve() if (logsrv->type == LOG_TARGET_BUFFER) { sink = sink_find(logsrv->ring_name); if (!sink || sink->type != SINK_TYPE_BUFFER) { - ha_alert("proxy '%s' log server uses unknown ring named '%s'.\n", px->id, logsrv->ring_name); + ha_alert("log server declared in proxy section '%s' in file '%s' at line %d uses unknown ring named '%s'.\n", px->id, logsrv->conf.file, logsrv->conf.line, logsrv->ring_name); err_code |= ERR_ALERT | ERR_FATAL; } logsrv->sink = sink; @@ -1018,7 +1018,7 @@ int post_sink_resolve() if (logsrv->type == LOG_TARGET_BUFFER) { sink = sink_find(logsrv->ring_name); if (!sink || sink->type != SINK_TYPE_BUFFER) { - ha_alert("log-forward '%s' log server uses unknown ring named '%s'.\n", px->id, logsrv->ring_name); + ha_alert("log server declared in log-forward section '%s' in file '%s' at line %d uses unknown ring named '%s'.\n", px->id, logsrv->conf.file, logsrv->conf.line, logsrv->ring_name); err_code |= ERR_ALERT | ERR_FATAL; } logsrv->sink = sink; -- 2.39.5