나는 haproxy에 대해 별도의 로깅을 구현하려고 노력해 왔습니다. 하지만 결국 중복된 로깅이 발생하고 입력 소켓이나 기능만을 기준으로 로그를 분리할 수 없습니다.
haproxy의 예시 구성은 다음과 같습니다.
전역 구성:
log /dev/log len 1024 format local local0 debug
Frontend-1 구성(웹 요청용):
log /dev/request-log len 1024 format local local1 debug
Frontend-2 구성(데이터베이스 요청용):
log /dev/db-log len 1024 format local local2 debug
그래서 여기서는 기본적으로 로그를 다른 소켓으로 리디렉션하려고 합니다. 또한 입력 소켓을 기반으로 메시지를 리디렉션하는 방법을 모르기 때문에 각 소켓에 대해 다른 기능을 사용하고 있습니다.
rsyslog 구성에 다음을 추가했습니다.
$AddUnixListenSocket /var/lib/haproxy/dev/log
local0.* /var/log/haproxy/haproxy.log
$AddUnixListenSocket /var/lib/haproxy/dev/request-log
local2.* /var/log/haproxy/requests.log
$AddUnixListenSocket /var/lib/haproxy/dev/db-log
local3.* /var/log/haproxy/db.log
그러나 위의 모든 로그 파일에는 동일한 로그 레코드가 있습니다. 즉, 웹 요청 로그 레코드, 데이터베이스 로그 레코드 및 기타 haproxy 로그 레코드가 이 세 파일에서 반복됩니다. 그리고 기본 /var/log/messages를 포함합니다.
rsyslog.conf를 완료하세요.
$ModLoad imuxsock
$ModLoad imjournal
$WorkDirectory /var/lib/rsyslog
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$SystemLogSocketName /run/systemd/journal/syslog
$OmitLocalLogging on
$IMJournalStateFile imjournal.state
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
*.emerg :omusrmsg:*
uucp,news.crit /var/log/spooler
local7.* /var/log/boot.log
local1.* /var/log/keepalived.log
$AddUnixListenSocket /var/lib/haproxy/dev/log
local0.* /var/log/haproxy/haproxy.log
$AddUnixListenSocket /var/lib/haproxy/dev/request-log
local2.* /var/log/haproxy/requests.log
$AddUnixListenSocket /var/lib/haproxy/dev/db-log
local3.* /var/log/haproxy/db.log
참고: 위 구성에서 언급한 keepalived.log에도 동일한 문제가 있습니다.
도구를 사용하는 대신 이와 같은 것을 사용하면 중복 없이 로깅이 잘 작동하는 것을 볼 수 있습니다.
:programname, startswith, "haproxy" {
/var/log/haproxy/haproxy.log
stop
}
그러나 이는 입력 소켓이나 시설 이름을 기준으로 메시지를 쉽게 필터링할 수 있는 경우에는 필요하지 않은 추가 처리입니다. 중복이 발생하는 이유를 이해하도록 도와줄 수 있는 사람이 있습니까? 중복이 없는 cron, 메일, authpriv 등과 같은 다른 기본 부분에서는 발생하지 않습니다. 아니면 소켓 입력을 기반으로 메시지를 리디렉션하는 방법은 무엇입니까?
답변1
처리 제한은 다음을 통해 이루어집니다.규칙 세트. 이를 통해 필터 세트를 그룹화하고 지정된 입력에만 적용할 수 있습니다. 규칙 세트 외부의 필터는 평소와 같이 추가 입력을 받습니다. 규칙 세트의 이전 구문을 사용할 수 있지만 RainerScript 스타일을 사용하는 것이 더 쉽습니다. 예를 들면 다음과 같습니다.
ruleset(name="rule1"){
*.* action(type="omfile" file="output1")
}
ruleset(name="rule2"){
*.* action(type="omfile" file="output2")
}
input(type="imuxsock" socket="/tmp/sock1" Ruleset="rule1")
input(type="imuxsock" socket="/tmp/sock2" Ruleset="rule2")
*.* -./output3
이 구성은 소켓을 읽고 모든 행과 일치하는 규칙 세트를 /tmp/sock1
적용하여 file 에 저장합니다 . 마찬가지로 데이터가 들어가고 , 일반 입력이 들어갑니다 .rule1
output1
sock2
output2
output3
따라서 마지막 6줄을 다음으로 바꾸세요.
ruleset(name="rule1"){
*.* action(type="omfile" file="/var/log/haproxy/haproxy.log")
}
input(type="imuxsock" socket="/var/lib/haproxy/dev/log" Ruleset="rule1")
등. 어쨌든 해당 행만 가져와야 하므로 local0 등을 필터링할 필요가 없습니다.