我有一个集中式 rsyslog 服务器 A,它通过 TCP 从服务器 X、Y、Z 接收大量日志。然后它将文件存储在磁盘上,但也将它们转发到 logstash 服务器 B(在另一台机器上)。要中继到 logstash 服务器 BI,请使用如下 TCP:
$template logstash_json,"{\"@timestamp\":\"%timestamp:::date-rfc3339,jsonf:@timestamp%\",\"@source_host\":\"%source:::jsonf:@source_host%\",\"@source\":\"syslog://%fromhost-ip:::json%\",\"@message\":\"%timestamp% %app-name%:%msg:::json%\",\"@fields\":{\"facility\":\"%syslogfacility-text:::jsonf:facility%\",\"severity\":\"%syslogseverity-text:::jsonf:severity%\",\"program\":\"%app-name:::jsonf:program%\",\"pid\":\"%procid:::jsonf:processid%\"}}"
$WorkDirectory /var/cache/rsyslog # default location for work (spool) files - make sure it's created
$ActionQueueType LinkedList # use asynchronous processing
$ActionQueueFileName srvrfwd # set file name, also enables disk mode
$ActionResumeRetryCount -1 # infinite retries on insert failure
$ActionQueueSaveOnShutdown on # save in-memory data if rsyslog shuts down
# Ship logs over TCP to logstash
*.* @@server_B:2514;logstash_json
每当我的 logstash 服务器关闭或无法访问时,一段时间后服务器 A 上的集中式 rsyslog 就会变得没有响应,结果就是我的服务器 X、Y、Z 在服务尝试写入 syslog 时开始冻结或出现意外的高负载。
如何配置 rsyslog(服务器端和/或客户端)以更好地应对此故障点?
附带问题:每当 logstash 服务器重新启动时,rsyslog 不会播放存储在 /var/cache/rsyslog 中的日志,有人知道如何配置吗?
答案1
您需要在 rsyslog 中配置排队,相关讨论在这里:
这是相关的答案部分——我假设您将在 s 之前查找实际文档中的指令:
在之前添加以下内容
*.* @@logs.papertrailapp.com
并重新启动 rsyslog 就可以了:$ActionResumeInterval 10
$ActionQueueSize 100000
$ActionQueueDiscardMark 97500
$ActionQueueHighWaterMark 80000
$ActionQueueType LinkedList
$ActionQueueFileName papertrailqueue
$ActionQueueCheckpointInterval 100
$ActionQueueMaxDiskSpace 2g
$ActionResumeRetryCount -1
$ActionQueueSaveOnShutdown on
$ActionQueueTimeoutEnqueue 10
$ActionQueueDiscardSeverity 0