From: Christopher Faulet Date: Mon, 23 Jun 2025 05:50:01 +0000 (+0200) Subject: BUG/MINOR: log: Be able to use %ID alias at anytime of the stream's evaluation X-Git-Tag: v3.0.12~108 X-Git-Url: http://git.haproxy.org/?a=commitdiff_plain;h=0ecb4f4780fc0c3afce7cf15b54352fd414a0d9e;p=haproxy-3.0.git BUG/MINOR: log: Be able to use %ID alias at anytime of the stream's evaluation In a log-format string, using "%[unique-id]" or "%ID" should be equivalent. However, for the first one, the unique ID is generated when the sample fetch function is called. For the alias, it is not true. It that case, the stream's unique ID is generated when the log message is emitted. Otherwise, by default, the unique id is automatically generated at the end of the HTTP request analysis. So, if the alias "%ID" is use in a log-format string anywhere before the end of the request analysis, the evaluation failed and the ID is considered as empty. It is not consistent and in contradiction with the "%ID" documentation. To fix the issue, instead of evaluating the unique ID when the log message is emitted, it is now performed on demand when "%ID" format is evaluated. This patch should fix the issue #3016. It should be backported to all stable versions. It relies on the following commit: * BUG/MINOR: stream: Avoid recursive evaluation for unique-id based on itself (cherry picked from commit 20a82027ceb7a46ce2a0cbe05e40c63d132601f7) Signed-off-by: Willy Tarreau (cherry picked from commit 609d9447e2ecfe6bc4854aa2c3ee9154a97b2710) Signed-off-by: Christopher Faulet (cherry picked from commit b07ee7114ded568f80fb1de115e11bc355916774) Signed-off-by: Christopher Faulet --- diff --git a/src/log.c b/src/log.c index c0a4cf6..3400f77 100644 --- a/src/log.c +++ b/src/log.c @@ -4837,8 +4837,13 @@ int sess_build_logline(struct session *sess, struct stream *s, char *dst, size_t case LOG_FMT_UNIQUEID: // %ID ret = NULL; - if (s) + if (s) { + /* if unique-id was not generated */ + if (!isttest(s->unique_id) && !lf_expr_isempty(&sess->fe->format_unique_id)) { + stream_generate_unique_id(s, &sess->fe->format_unique_id); + } ret = lf_text_len(tmplog, s->unique_id.ptr, s->unique_id.len, maxsize - (tmplog - dst), ctx); + } else ret = lf_text_len(tmplog, NULL, 0, maxsize - (tmplog - dst), ctx); if (ret == NULL) @@ -4935,11 +4940,6 @@ void strm_log(struct stream *s) level = LOG_ERR; } - /* if unique-id was not generated */ - if (!isttest(s->unique_id) && !lf_expr_isempty(&sess->fe->format_unique_id)) { - stream_generate_unique_id(s, &sess->fe->format_unique_id); - } - if (!lf_expr_isempty(&sess->fe->logformat_sd)) { sd_size = build_logline(s, logline_rfc5424, global.max_syslog_len, &sess->fe->logformat_sd);