
最终,我的目标是将 ShadowSOCKS 服务器与 fail2ban 集成,但我在让 ShadowSOCKS 容器写入日志文件的中间步骤中遇到了麻烦(ShadowSOCKS docker 将其日志输出到 stdout 并且缺少 syslog 文件)。由于我已经使用 ELK 堆栈来管理我的容器和 syslog,我认为最简单的方法是通过 logstash。
ShadowSOCKS、ELK 和 fail2ban 都在 docker 中运行,除了此功能外,其他均能正常使用。
为了写入文件,我编辑了 logstash-agent 配置文件,如下所示:
input {
gelf {
port => 12201
}
file {
path => "/var/log/syslog"
start_position => "beginning"
type => "syslog"
}
}
output {
redis {
host => "redis-cache"
data_type => "list"
key => "logstash"
}
if [tag] == "shadowsocks" {
file {
path => "/shadowsocks.log"
codec => "json_lines"
}
}
}
/shadowsocks.log
然后我通过 docker-compose 与主机系统共享该文件:
...
logstash-agent:
image: logstash:7.11.1
container_name: logstash-agent
volumes:
- ./logstash-agent:/etc/logstash
- /var/log/syslog:/var/log/syslog:ro
- /srv/shadowsocks/logs/shadowsocks.log:/shadowsocks.log
command: logstash -f /etc/logstash/logstash.conf
depends_on:
- elasticsearch
ports:
- 10.0.0.1:12201:12201/udp
restart: unless-stopped
...
看起来很简单,但是日志文件没有出现。
以下是显示 gelf 标签的 shadowsocks 容器:
version: '3.9'
services:
shadowsocks:
image: shadowsocks/shadowsocks-libev
container_name: shadowsocks
ports:
- 8388:8388
environment:
- METHOD=
- PASSWORD=
restart: always
logging:
driver: gelf
options:
gelf-address: "udp://10.0.0.1:12201"
tag: "shadowsocks"
我在这里遗漏了什么?