功能概述

配置 Rsyslog 远端云服务器可以将负载均衡器的日志流输出到指定的云服务器。日志格式请参考 HAProxy文档 8.2.1 Default log format

操作步骤

步骤一:创建远端服务器

  1. 创建一台 Linux 云服务器,详细操作可参考创建云服务器。云服务器要求如下。

    • 推荐使用 Ubuntu 操作系统。

    • 对于公网负载均衡器,云服务器需配置为负载均衡器的后端。

    • 对于私网负载均衡器,云服务器和负载均衡器需属于同一网络。

  2. 登录上一步创建的云服务器,修改 /etc/rsyslog.conf 配置文件,在配置中添加如下内容。

    $ModLoad imudp
    $UDPServerAddress 0.0.0.0
    $UDPServerRun 514
    说明

    UDPServerAddress 必须在 UDPServerRun 前面。

  3. 创建 /etc/rsyslog.d/haproxy.conf 文件,并添加如下内容。

    local0.* /var/log/haproxy.log
  4. 执行如下命令行,重启服务。

    service rsyslog restart
  5. 放行上文创建的云服务器所在的安全组的 UDP 协议 的 514 端口。

步骤二:配置负载均衡器

参考日志配置,将负载均衡器的 rsyslog 远端云服务器 的 IP 地址设置为上文创建的云服务器 IP 地址即可。

步骤三:分析 Rsyslog 日志

对于已收集到的 Rsyslog 日志,可参考以下内容进行分析。

TCP 转发日志

  • 日志格式

    Mar 29 12:16:55 198.19.56.127 haproxy[686]: 111.47.226.115:17652 [29/Mar/2021:10:32:46.135] lbl-l1rmzsj5 lbl-l1rmzsj5_default/lbb-mfc8im36 1/0/6249762 92826 -- 1/1/1/0/0 0/0
    #haproxy[686]:    #process_name '[' pid ']:'
    #111.47.226.115:17652          #client_ip ':' client_port
    #[29/Mar/2021:10:32:46.135]  #'[' accept_date ']'
    #lbl-l1rmzsj5                    #frontend_name
    #lbl-l1rmzsj5_default/lbb-mfc8im36             #backend_name
    #1/0/6249762                    #Tw '/' Tc '/' Tt*
    #92826                        #bytes_read*
    #--                          #termination_state
    #1/1/1/0/0                   #actconn '/' feconn '/' beconn '/' srv_conn '/' retries*
    #0/0                         #srv_queue '/' backend_queue
  • 字段说明

    字段 说明

    client_ip

    连接到 haproxy 的客户端的 IP 地址

    client_port

    发起连接的客户端的 TCP 端口。

    accept_date

    haproxy 接收到连接的确切时间。

    frontend_name

    负载均衡器监听器 ID。

    backend_name

    后端名称,由 <监听器 ID>_default/<后端名称> 组成。

    Tw

    在各种队列中等待的总时间,单位为 毫秒。如果连接在到达队列之前被中止,其值可能为 -1

    Tc

    等待连接建立到最终服务器的总时间,单位为 毫秒,包括重试。如果在建立连接之前连接被中止,其值可能为 -1

    Tt

    在接受和最后一次关闭之间经过的总时间,单位为 毫秒。涵盖了所有可能的处理,但如果指定了 选项logasap,则在发出日志的时刻计时停止。该情况下,在该值之前加上 + 号,表示最后一个会更大。

    bytes_read

    发送日志时,从服务器发送到客户端的总字节数。

    termination_state

    会话结束时会话的条件。

    • 这表示在会话状态,哪一方导致了会话结束,以及什么原因。

    • 正常标志应为 -,表示会话已由两端关闭,缓冲区中没有剩余数据。

    actconn

    会话记录时进程上的并发连接总数。

    feconn

    会话记录时前端上的并发连接总数。

    beconn

    会话记录时由后端处理的并发连接的总数。

    srv_conn

    会话记录时服务器上仍然处于活动状态的并发连接总数。

    retries

    尝试连接到服务器时此会话遇到的连接重试次数。

    srv_queue

    在服务器队列中之前处理的请求的总数。

    backend_queue

    在后端的全局队列中之前处理的请求的总数。

HTTP 转发日志

  • 日志格式

    Jun 22 13:47:56 198.19.173.227 haproxy[40849]: 42.91.108.84:11918 [22/Jun/2020:13:47:50.784] lbl-2tqyo6fr lbl-2tqyo6fr_default/lbb-jdbamki3 1/0/2/5900/5903 200 518 - - ---- 154/150/140/20/0 0/0 POST /v0.1/device/DeviceHeartBeat HTTP/1.1
    #haproxy[40849]:          #process_name '[' pid ']:'
    #42.91.108.84:11918      #client_ip ':' client_port
    #[22/Jun/2020:13:47:50.784]   #'[' request_date ']'
    #lbl-2tqyo6fr                  #frontend_name
    #lbl-2tqyo6fr_default/lbb-jdbamki3           #backend_name
    #1/0/2/5900/5903                    #TR '/' Tw '/' Tc '/' Tr '/' Ta*
    #200                          #status_code
    #518                          #bytes_read*
    #-                            #captured_request_cookie
    #-                            #captured_response_cookie
    #----                         #termination_state
    #154/150/140/20/0                    #actconn '/' feconn '/' beconn '/' srv_conn '/' retries*
    #0/0                          #srv_queue '/' backend_queue
    #"POST /v0.1/device/DeviceHeartBeat HTTP/1.1"        #'"' http_request '"'
  • 字段说明

    字段 说明

    client_ip

    连接到 Haproxy 的客户端的 IP 地址。

    client_port

    发起连接的客户端的 TCP 端口。

    accept_date

    通过 Haproxy 接收到 HTTP 请求的第一个字节的确切时间。

    frontend_name

    负载均衡器监听器 ID。

    backend_name

    后端名称,由 <监听器 ID>_default/<后端名称> 组成。

    TR

    在接收到第一个字节后,等待来自客户端的不包括正文的 HTTP 请求花费的总时间。

    • 单位为 毫秒

    • 如果接收到完整的请求或接收到错误的请求之前连接被中止,其值可能为 -1

    Tw

    各种队列中等待的总时间,单位为 毫秒。 如果连接在到达队列之前被中止,其值可能为 -1

    Tc

    等待连接建立到最终服务器的总时间,单位为 毫秒,包括重试次数。如果在建立连接之前连接被中止,其值可能为 -1

    Ta

    请求在 Haproxy 中保持活动的时间,这是在接收到的请求的第一个字节和发送的最后一个字节之间经过的总时间,单位为 毫秒

    status_code

    返回给客户端的 HTTP 状态代码。通常由服务器设置,当服务器无法到达或其响应被 Haproxy 阻止时也可以通过 Haproxy 设置。

    bytes_read

    发送日志时,从服务器发送到客户端的总字节数。

    captured_request_cookie

    一个可选的 name = value 的条目,指示客户端在请求中具有此 Cookie。

    • Cookie 名称及其最大长度由前端配置中的 capture cookie 语句定义。

    • 当该选项未设置时,该字段是单个破折号 -

    termination_state

    会话结束时会话的条件。这表示会话状态,哪一方导致会话结,以及什么原因(超时,错误,…​)。

    actconn

    会话记录时进程上的并发连接总数。

    feconn

    会话记录时前端上的并发连接总数。

    beconn

    会话记录时由后端处理的并发连接的总数。

    srv_conn

    会话记录时服务器上仍然处于活动状态的并发连接总数。

    retries

    尝试连接到服务器时此会话遇到的连接重试次数。

    srv_queue

    在服务器队列中之前处理的请求的总数。

    backend_queue

    在后端的全局队列中之前处理的请求的总数。

    captured_request_headers

    由于在前端存在 捕获请求头 语句,在请求中捕获的标题列表。

    captured_response_headers

    由于在前端存在 捕获响应头 语句,在响应中捕获的标题列表。

    http_request

    完整的 HTTP 请求行,包括方法,请求和 HTTP 版本字符串。