编辑:实际问题最终要么是 local0 与 local2 的区别,要么是 rsyslog 的处理结束。
我正在构建一个 kubernetes/openshift 集群,在此之前,我需要为 api 服务器和应用程序服务设置一个 L4 LB。即使流量本身实际上是 https,流量也是在 tcp 级别处理的。进行此设置的原因是 kubernetes/openshift 拥有证书及其密钥,即使 apiserver / http apps 通配符记录的 DNS 指向的 IP 地址位于 haproxy 主机上。
负载平衡有效,即流量毫无问题地到达应有的位置,但 haproxy 坚持将其所有日志写入/var/log/messages
而不是 under /var/log/haproxy/haproxy.log
,尽管我尽了一切努力来实现这一点。据我所知:
- rsyslog 正在监听 udp 端口 514
- rsyslog 被指示按照 haproxy 文档和许多答案中的指示将这些内容写入 haproxy 文件中
- haproxy 被指示将其日志发送到 127.0.0.514 。
主机系统是RHEL8,haproxy 1.8.15和rsyslog 8.37是从官方仓库安装的。
这是我的相关部分/etc/haproxy/haproxy.cfg
:
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local0
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
.
.
.
# ---------------------------------------------------------------------
# round robin balancing for OCP Ingress Insecure Port
# ---------------------------------------------------------------------
frontend ingress_insecure
bind *:80
mode tcp
option tcplog
default_backend ingress_insecure_backend
backend ingress_insecure_backend
balance roundrobin
mode tcp
server worker1.cluster.example.com <ip address>:80 check
server worker2.cluster.example.com <ip address>:80 check
这是我的/etc/rsyslog.d/haproxy
:
local0.* /var/log/haproxy/haproxy.log
& stop
这些行存在于/etc/rsyslog.conf
:
# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
module(load="imudp") # needs to be done just once
input(type="imudp" port="514")
这是以下的输出netstat -tulpn
:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
--- clip ---
udp 0 0 0.0.0.0:514 0.0.0.0:* 8031/rsyslogd
udp6 0 0 :::514 :::* 15270/rsyslogd
--- clip ---
这是以下的输出ls
:(我手动创建了目录,并给了它非常宽松的访问模式,以确保它不会停在那里)
# ls -ld /var/log/haproxy
drwxrwxrwx 2 root root 6 Dec 18 14:40 /var/log/haproxy
# ls -la /var/log/haproxy
total 12
drwxrwxrwx 2 root root 6 Dec 18 14:40 .
drwxr-xr-x. 11 root root 8192 Dec 18 14:50 ..
然而,haproxy日志数据仍然只出现在下面/var/log/messages
而不是出现在下面/var/log/haproxy/
。有什么指示可以进一步查看吗?
答案1
好吧,看来这个https://linuxconfig.org/install-and-configure-haproxy-on-redhat-8解决了我的问题。
更改如下:
/etc/haproxy/haproxy.cfg:
global
-- clip --
log 127.0.0.1 local2
-- clip --
/etc/rsyslog.d/haproxy.conf:
local2.=info /var/log/haproxy/haproxy-access.log
local2.notice /var/log/haproxy/haproxy-info.log
另请注意文件名!另一个问题是我的 ansible 脚本(将这些文件放在适当的位置)有一个错误,rsyslog 配置文件错过了“.conf”部分!
然后重启相关服务:
# systemctl restart rsyslog
# systemctl restart haproxy
作为旁注,tcpdump 还让我看到确实存在系统日志流量:
# tcpdump -i lo
-- clip --
17:11:35.178564 IP localhost.58466 > localhost.syslog: SYSLOG local2.info, length: 157
-- clip --
(当从另一个终端进行操作时curl 127.0.0.1
——但是,如果有大量其他流量正在进行,这种调试有点不可行。我有幸成为现在唯一对这台机器发出请求的人/事。)
现在另一件事是日志记录在 /var/log/messages 和 /var/log/haproxy/ 中重复。感谢一位同事,我通过更改另一行解决了这个问题/etc/rsyslog.conf
:
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
改变成:
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none;local2.none /var/log/messages