Graylog 集中日志管理系统部署
Graylog 是一款企业级开源日志管理平台,底层使用 Elasticsearch(或 OpenSearch)存储数据,MongoDB 存储配置信息。相比原生的 ELK Stack,Graylog 提供了更加友好的 Web 管理界面、内置的告警系统和权限管理功能。本文将在搬瓦工 VPS 上使用 Docker 部署 Graylog。
一、环境要求
- 内存:建议至少 4GB(Graylog + OpenSearch + MongoDB)。
- 磁盘:日志存储需要大量空间,建议 40GB 以上。
- 前置条件:已安装 Docker。
二、准备密码和密钥
# 生成 password_secret(至少 16 个字符的随机字符串)
pwgen -N 1 -s 96
# 或使用
openssl rand -hex 48
# 生成 root_password_sha2(管理员密码的 SHA-256 哈希)
echo -n "your_admin_password" | sha256sum | awk '{print $1}'
三、Docker Compose 部署
mkdir -p /opt/graylog
cat > /opt/graylog/docker-compose.yml <<'EOF'
version: '3.8'
services:
mongodb:
image: mongo:6.0
container_name: graylog-mongo
restart: unless-stopped
volumes:
- mongo-data:/data/db
opensearch:
image: opensearchproject/opensearch:2.12.0
container_name: graylog-opensearch
restart: unless-stopped
environment:
- cluster.name=graylog-cluster
- node.name=graylog-node
- discovery.type=single-node
- bootstrap.memory_lock=true
- OPENSEARCH_JAVA_OPTS=-Xms1g -Xmx1g
- DISABLE_SECURITY_PLUGIN=true
- DISABLE_INSTALL_DEMO_CONFIG=true
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- opensearch-data:/usr/share/opensearch/data
graylog:
image: graylog/graylog:6.0
container_name: graylog
restart: unless-stopped
depends_on:
- mongodb
- opensearch
environment:
- GRAYLOG_PASSWORD_SECRET=YOUR_PASSWORD_SECRET_HERE
- GRAYLOG_ROOT_PASSWORD_SHA2=YOUR_SHA256_HASH_HERE
- GRAYLOG_HTTP_BIND_ADDRESS=0.0.0.0:9000
- GRAYLOG_HTTP_EXTERNAL_URI=http://YOUR_SERVER_IP:9000/
- GRAYLOG_ELASTICSEARCH_HOSTS=http://opensearch:9200
- GRAYLOG_MONGODB_URI=mongodb://mongodb:27017/graylog
ports:
- "9000:9000" # Web 界面
- "1514:1514" # Syslog TCP
- "1514:1514/udp" # Syslog UDP
- "12201:12201" # GELF TCP
- "12201:12201/udp" # GELF UDP
- "5555:5555" # Raw/Plaintext TCP
volumes:
- graylog-data:/usr/share/graylog/data
volumes:
mongo-data:
opensearch-data:
graylog-data:
EOF
设置系统参数
# OpenSearch 需要的系统参数
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p
启动服务
cd /opt/graylog
docker compose up -d
# 等待初始化完成(约 1-2 分钟)
docker compose logs -f graylog
四、初始登录
访问 http://你的IP:9000,使用以下凭据登录:
- 用户名:admin
- 密码:你在生成 SHA-256 哈希时使用的原始密码。
五、配置输入源(Inputs)
Graylog 通过「Inputs」接收外部日志数据。进入「System」→「Inputs」。
5.1 Syslog UDP 输入
- 选择「Syslog UDP」,点击「Launch new input」。
- 设置绑定地址
0.0.0.0,端口1514。 - 勾选「Global」使其在所有节点生效。
在被监控的服务器上配置 rsyslog 转发:
# /etc/rsyslog.d/graylog.conf
*.* @YOUR_GRAYLOG_IP:1514;RSYSLOG_SyslogProtocol23Format
systemctl restart rsyslog
5.2 GELF 输入
GELF(Graylog Extended Log Format)是 Graylog 自定义的日志格式,支持结构化数据:
- 选择「GELF UDP」或「GELF TCP」。
- 绑定端口
12201。
Docker 容器可以直接使用 GELF 日志驱动:
docker run -d \
--log-driver=gelf \
--log-opt gelf-address=udp://YOUR_GRAYLOG_IP:12201 \
--log-opt tag="myapp" \
your-app:latest
5.3 Raw/Plaintext 输入
用于接收纯文本格式的日志,端口 5555。适合通过 netcat 等工具直接发送日志。
六、日志处理管道(Pipelines)
Graylog 的 Pipeline 功能可以对收到的日志进行实时处理和转换。进入「System」→「Pipelines」。
6.1 创建规则
rule "extract nginx fields"
when
has_field("message") AND contains(to_string($message.message), "GET")
then
let parsed = grok(pattern: "%{COMBINEDAPACHELOG}", value: to_string($message.message));
set_field("client_ip", parsed.clientip);
set_field("http_method", parsed.verb);
set_field("http_status", to_long(parsed.response));
set_field("url_path", parsed.request);
end
6.2 创建管道
- 创建新管道,添加阶段(Stage)。
- 将规则绑定到对应的阶段。
- 将管道连接到指定的数据流(Stream)。
七、数据流(Streams)
Streams 用于将日志按条件路由到不同的存储和处理通道:
- 进入「Streams」→「Create stream」。
- 添加规则,例如「field source matches exactly nginx」。
- 将匹配的日志路由到特定索引集,可设置不同的保留策略。
八、告警配置
Graylog 内置告警系统,进入「Alerts」→「Event Definitions」:
8.1 创建事件定义
- Condition Type:选择「Filter & Aggregation」。
- Search Query:输入触发条件,如
http_status:>=500。 - Aggregation:设置聚合条件,如「count() > 10 in 5 minutes」。
8.2 配置通知
在「Notifications」中配置告警发送方式:
- Email:需要在 Graylog 配置文件中设置 SMTP。
- HTTP:发送 Webhook 请求到指定 URL。
- Slack:通过 Slack Webhook 发送通知。
九、索引管理
进入「System」→「Indices」管理索引集:
- Index Rotation:设置索引轮转策略(按时间、大小或消息数量)。
- Index Retention:设置保留策略,自动删除过期索引。
- 建议配置:每天轮转一次,保留 30 天数据。
# 查看索引状态
curl http://localhost:9200/_cat/indices?v
十、常见问题
Graylog 无法启动
# 查看日志
docker compose logs graylog
# 常见原因:
# 1. password_secret 或 root_password_sha2 未正确设置
# 2. OpenSearch 未就绪
# 3. vm.max_map_count 未设置
收不到日志
确认 Input 已正确创建且显示为「Running」状态。检查防火墙是否放行了对应端口。
# 测试日志发送
echo "test message" | nc -u YOUR_GRAYLOG_IP 1514
总结
Graylog 提供了比原生 ELK Stack 更加友好的日志管理体验,内置的告警、权限和管道功能大大降低了运维门槛。对于轻量级场景,也可以考虑 Grafana Loki 方案。选购搬瓦工 VPS 请参考 全部方案,使用优惠码 NODESEEK2026 可享受 6.77% 的循环折扣。