Hi,
I have a beginner question please: in 2.6 and 2.8 I am using this custom
log-format to log the body of requests:
global
...
log 127.0.0.1 len 32000 local0
tune.http.logurilen 20480
...
defaults
...
log-format "%ci:%cp [%tr] %ft %b/%s %TR/%Tw/%Tc/%Tr/%Ta %ST %B %CC %CS %tsc
%ac/%fc/%bc/%sc/%rc %sq/%bq %{+Q}r
%[fc_err]/%[ssl_fc_err,hex]/%[ssl_c_err]/\%[ssl_c_ca_err]/%[ssl_fc_is_resumed]
%[ssl_fc_sni]/%sslv/%sslc Payload: %{+Q}[capture.req.hdr(0)]"
...
frontend https-in
bind *:443 ssl crt /ssl/ alpn h2,http/1.1 shards by-thread
bind [::]:443 ssl crt /ssl/ alpn h2,http/1.1 shards by-thread
# Here I capture the body payload of max 10k characters
declare capture request len 10000
http-request capture req.body id 0
mode http....
and if I send a json as payload with curl like this:
curl -X POST http://domain.com:80/api -H "Content-Type: application/json" -d
'{"city": "SomeCity"}'
I get:
<134>1 2025-03-27T23:40:59+00:00 localhost haproxy 800275 - - ip-here:43116
[27/Mar/2025:23:40:59.018] https-in test/server1 0/0/0/6/6 200 160 - - ----
1/1/0/0/0 0/0 "POST /api HTTP/1.1" 0/-/-/\-/0 -/-/- Payload: "{"city":
"SomeCity"}"
this means the json was received correctly: Payload: "{"city": "SomeCity"}"
But if my json has a new line inside it like this:
curl -X POST http://domain.com:80/api -H "Content-Type: application/json" -d
"$(printf '{"city":\n"SomeCity"}')"
I get:
#012 instead of new line:
<134>1 2025-03-27T23:44:34+00:00 localhost haproxy 800275 - - ip-here:40356
[27/Mar/2025:23:44:34.056] https-in test/server1 0/0/0/4/4 200 159 - - ----
1/1/0/0/0 0/0 "POST /api HTTP/1.1" 0/-/-/\-/0 -/-/- Payload: "{"city":
#012"SomeCity"}"
and my Payload: "{"city": #012"SomeCity"}" contains #012 numbers now which the
backend apps cannot make too much sense of (I don't have control over backend
apps).
and sometimes #012#015 which corresponds to the platform that sent the message:
LF+CR or just LF.
Is there a way to unescape these numbers to characters in Haproxy alone? In my
particular case I don't have control over the backend apps so I need to
'sanitize' the json before leaving haproxy/before logged to disk/sent to
rsyslogd.
Thank you,
Dragos
Ps: to log via rsyslogd such big messages (10k characters or more) on Ubuntu
like systems, you also need this in /etc/rsyslog.d/50-default.conf
$MaxMessageSize 32k
besides the rsyslog haproxy config, otherwise it will truncate the logs to a
default lower value.