두 개의 syslog 서버로 서버를 구성하려고 합니다. 하나는 모든 메시지를 저장하는 것이고, 다른 하나는 통계를 위해 분석하는 것입니다.
이 작업을 수행하는 방법을 알아낼 수 있는 유일한 방법은 일종의 포트 미러링을 수행하고 포트 514에서 모든 인바운드 패킷을 찾아서(그러나 원래 패킷이 포트 514의 rsyslog로 이동하도록 허용) 복사한 다음 보내는 것입니다. 소스 IP를 유지하면서 동일한 상자의 다른 포트에 연결하십시오.
샘플리케이터를 찾았지만 시스템의 바인딩된 포트에서는 작동하지 않습니다.
어떻게 해야 하나요?
답변1
Rsyslog 전달 설정
프로그램
로그 인덱스 호스트에서 TCP 수신을 설정하려면 /etc/rsyslog.conf에서 다음 줄의 주석 처리를 해제하세요. 이렇게 하면 rsyslog 데몬이 TCP 포트 514에서 들어오는 요청을 수신할 수 있습니다. 여기서는 브로커 호스트의 메시지가 인덱서에 도달하는지 확인할 수 있도록 TCP를 사용합니다. (이에 대해서는 아래에서 자세히 설명)
TCP 시스템 로그 수신 제공
$ModLoad imtcp
$InputTCPServerRun 514
Add a line to /etc/rsyslog.conf to actually put the received logs in a specific file.
local3.* /local/logs/httpd-error
local4.* /local/logs/httpd-access```
Finally, restart the rsyslog process.
```service rsyslog restart```
**Set up the agent host**
On the agent host, the host that is running apache, add a file, /etc/rsyslog.d/apache.conf. This will be read at syslog start time. This file tells rsyslog to read /var/log/httpd/error_log (the default apache error log on CentOS) every 10 seconds and send its messages to the local3.info facility in syslog. (Expanded to also read Access logs and send those to local4.info)
$ModLoad imfile
# Default Apache Error Log
$InputFileName /var/log/httpd/error_log
$InputFileTag httpd-error-default:
$InputFileStateFile stat-httpd-error
$InputFileSeverity info
$InputFileFacility local3
$InputRunFileMonitor
# Default Apache Access Log
$InputFileName /var/log/httpd/access_log
$InputFileTag httpd-access-default:
$InputFileStateFile stat-httpd-access
$InputFileSeverity info
$InputFileFacility local4
$InputRunFileMonitor
$InputFilePollInterval 10
그런 다음 /etc/rsyslog.conf를 수정하고 주석 처리를 해제하거나 파일 끝에 다음 줄을 추가합니다. 이는 rsyslog에 로그 대기열을 설정하고 local3 및 local4 시설 로그 메시지를 TCP 포트 192.168.10.11로 전달하도록 지시합니다. @@는 TCP 시스템 로그 포트를 의미하는 rsyslog의 약어입니다. UDP를 통해 전달하려면 단일 @를 사용하십시오. 그러나 이 경우 rsyslog는 인덱스 호스트가 UDP 패킷을 수신하는지 확인할 수 없기 때문에 대기열을 설정하는 것이 가치가 없을 수 있습니다.
이 구성에서 프록시 호스트는 인덱스 호스트로 보낼 수 없는 모든 로그 메시지를 저장합니다. 이는 인덱스 호스트가 재부팅 중이거나 사용할 수 없는 상황을 처리하는 데 유용합니다.
$WorkDirectory /var/lib/rsyslog # where to place spool files
$ActionQueueFileName fwdRule1 # unique name prefix for spool files
$ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible)
$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
$ActionQueueType LinkedList # run asynchronously
$ActionResumeRetryCount -1 # infinite retries if host is down
local3.* @@192.168.10.11
local4.* @@192.168.10.11
마지막으로 에이전트 호스트에서 rsyslog를 다시 시작합니다.
service rsyslog restart
테스트 구성
이제 Apache 서버를 다시 시작하면(서비스 httpd 다시 시작) 인덱스 호스트의 /local/logs/httpd-error에 생성된 로그가 표시됩니다. 그렇지 않은 경우 호스트 사이에 방화벽 블록이 있는지, rsyslog 구성 변경 사항이 올바르게 구문 분석되고 있는지 확인하세요. 다음 명령을 사용하여 rsyslog 구성을 확인할 수 있습니다: /sbin/rsyslogd -c5 -f /etc/rsyslog.conf -N1
새 파일을 사용하도록 Logstash 구성
이 구성은 사용자 정의 grok 파서를 사용하여 메시지에서 오류 수준을 추출하고 rsyslog 구성에서 설정한 레이블을 자체 필드로 추출합니다. grok 필터를 사용자 정의하는 데 도움이 필요하면 확인하세요.http://grokdebug.herokuapp.com/
input {
file {
type => "httpd-error-log"
path => ["/local/logs/httpd-error"]
sincedb_path => "/opt/logstash/sincedb-access"
discover_interval => 10
}
file {
type => "httpd-access-log"
path => ["/local/logs/httpd-access"]
sincedb_path => "/opt/logstash/sincedb-access"
discover_interval => 10
}
}
filter {
if [type] == "httpd-error-log" {
grok {
match => [ "message", "\S+ \d+ \d+:\d+:\d+ %{HOSTNAME} %{NOTSPACE:tag}: \[%{DAY} %{MONTH} %{MONTHDAY} %{TIME} %{YEAR}\] \[%{LOGLEVEL:level}\] %{GREEDYDATA}" ]
}
mutate {
rename => [ "program", "vhost" ]
}
}
if [type] == "httpd-access-log" {
grok {
match => [ "message", "\S+ \d+ \d+:\d+:\d+ %{HOSTNAME} %{NOTSPACE:tag}: %{COMBINEDAPACHELOG}" ]
add_field => { "level", "info" }
}
}
}
output {
elasticsearch {
host => "localhost"
}
}
이 GitHub 프로젝트를 확인해보세요 https://gist.github.com/GaryRogers/85c8f2a805010ceeccc6