我已将 HAProxy 实例配置为记录到特殊的自制守护程序,该守护程序将日志文件放入数据库中。我在一些日志消息中看到一些问题,其中字段host_header
无缘无故被截断。例如,而不是:
56:34 haproxy[892]: 1.2.3.4:17907 [14/May/2012:13:56:33.999] app.prod app.prod/webp01 0/0/0/161/524 200 33627 - - --NI 0/0/0/0/0 0/0 {application.example.com} "GET /?feed=rss2 HTTP/1.0"
我懂了:
56:34 haproxy[892]: 1.2.3.4:17907 [14/May/2012:13:56:33.999] app.prod app.prod/webp01 0/0/0/161/524 200 33627 - - --NI 0/0/0/0/0 0/0 {application.examp} "GET /?feed=rss2 HTTP/1.0"
请注意,host_header 已从 截断application.example.com
为application.examp
。
这给试图通过这些日志进行耕作带来了一些麻烦,那么发生这种情况的原因是什么呢?
HAProxy 版本1.4.18-0ubuntu1
在 Ubuntu 12.04 上运行。
答案1
由于这些具有完全相同的时间戳和时间,我猜您没有包括实际的例子。
如果没有这些例子,我能想到的最好的方法就是尝试使用以下命令手动设置这些标头字段的长度:
捕获请求头Host len 50
还要注意,由于 syslog 流量是 UDP,因此可能会出现一定程度的损坏(尽管这听起来比这更具体)。HAProxy 中还有一个最大长度设置。我从未尝试增加这个值,但如果你想尝试,以下是我与 HAProxy 作者的通信:
> 我可以增加 HAProxy 发送的系统日志消息的长度吗? > > 是不是只要改变一下就很简单了: >#定义MAX_SYSLOG_LEN 1024 > 在 > 包括/类型/log.h > > 或者还有更多事情? 您可以尝试,但具体操作可能取决于您的系统日志服务器。 有些人接受这些信息,有些人会截断这些行,YMMV。”
答案2
从我在代码中看到的情况来看,这根本不可能(检查 proto_http.c 中的 capture_headers())。标头被截断为请求的长度。因此,如果您确定在通过同一前端的同一主机的请求中看到此行为,我能想到的唯一可能性是有时您有两个标头字段,一个带有缩短的值,另一个带有正常值,并且 haproxy 仅记录第一个,而服务器使用最后一个。