让logstash写入文件和redis

让logstash写入文件和redis

最终,我的目标是将 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"

我在这里遗漏了什么?

相关内容