Graylog 部署指南:集中式日志管理平台搭建和使用
生产环境有多台服务器时,日志分散在各个机器上,出了问题要逐台 ssh 查 log 文件,既慢又容易遗漏。Graylog 是开源的集中式日志管理平台,可以统一收集、存储、搜索所有服务器的日志,支持结构化日志解析、告警规则、可视化仪表板,是排查线上问题的利器。
架构说明
Graylog 依赖以下组件:
应用/服务器 → GELF/Syslog/Beats → Graylog → Elasticsearch/OpenSearch → 存储 ↓ MongoDB(存配置) ↓ Web UI(搜索、告警、仪表板)服务器配置建议
| 日志量 | CPU | 内存 | 硬盘 |
|---|---|---|---|
| 小型(< 1GB/天) | 2 核 | 4G | 100GB |
| 中型(< 10GB/天) | 4 核 | 8G | 500GB |
日志量大时 Elasticsearch 是性能瓶颈,优先给内存。我在 雨云服务器 rainyun+com 开了台 4 核 8G 的服务器专门跑 Graylog,每天处理几百 MB 日志完全没有压力。雨云新用户注册填优惠码2026off能领 5 折优惠券。
Docker Compose 部署
mkdir-p/opt/graylogcd/opt/graylog生成密码哈希(用于 admin 账户密码):
echo-n"你的管理员密码"|sha256sum# 记录输出的哈希值生成 Secret:
openssl rand-hex32# 记录输出的随机字符串cat>/opt/graylog/docker-compose.yml<<'COMPOSE' version: "3.8" services: mongodb: image: mongo:6.0 container_name: graylog_mongo volumes: - mongo_data:/data/db restart: unless-stopped opensearch: image: opensearchproject/opensearch:2.12.0 container_name: graylog_opensearch environment: - OPENSEARCH_JAVA_OPTS=-Xms2g -Xmx2g - bootstrap.memory_lock=true - discovery.type=single-node - plugins.security.disabled=true - action.auto_create_index=false ulimits: memlock: soft: -1 hard: -1 nofile: soft: 65536 hard: 65536 volumes: - opensearch_data:/usr/share/opensearch/data restart: unless-stopped graylog: image: graylog/graylog:6.0 container_name: graylog environment: - GRAYLOG_PASSWORD_SECRET=上面生成的随机字符串 - GRAYLOG_ROOT_PASSWORD_SHA2=上面生成的SHA256哈希 - GRAYLOG_HTTP_EXTERNAL_URI=https://log.你的域名.com/ - GRAYLOG_ELASTICSEARCH_HOSTS=http://opensearch:9200 - GRAYLOG_MONGODB_URI=mongodb://mongodb:27017/graylog - GRAYLOG_TIMEZONE=Asia/Shanghai - TZ=Asia/Shanghai ports: - "9000:9000" # Web UI - "12201:12201/udp" # GELF UDP - "12201:12201/tcp" # GELF TCP - "5044:5044" # Beats - "514:514/udp" # Syslog UDP depends_on: - mongodb - opensearch volumes: - graylog_data:/usr/share/graylog/data restart: unless-stopped volumes: mongo_data: opensearch_data: graylog_data: COMPOSEdockercompose up-d启动需要等待约 1-2 分钟,OpenSearch 初始化较慢:
dockercompose logs-fgraylog# 看到 Graylog server up and running 就好了配置 HTTPS(Caddy)
sudotee-a/etc/caddy/Caddyfile<<'EOF' log.你的域名.com { reverse_proxy localhost:9000 } EOFsudosystemctl reload caddy初始配置
访问https://log.你的域名.com,用admin+ 你设置的密码登录。
创建 Input(接收日志的入口)
System → Inputs → 选择类型 → Launch常用 Input 类型:
- GELF UDP:推荐,支持结构化日志,低开销
- Syslog UDP:接收系统日志
- Beats:配合 Filebeat 收集文件日志
配置 GELF UDP Input:
- Bind address:
0.0.0.0 - Port:
12201 - 点击 Save
发送日志到 Graylog
方法一:GELF(推荐)
Docker 容器日志:
# docker-compose.yml 里的服务services:myapp:image:myapplogging:driver:"gelf"options:gelf-address:"udp://Graylog服务器IP:12201"tag:"myapp"Python 应用:
pip install graypyimportloggingimportgraypy logger=logging.getLogger('myapp')handler=graypy.GELFUDPHandler('Graylog服务器IP',12201)logger.addHandler(handler)logger.info("应用启动",extra={'user_id':123,'request_id':'abc-123'})Node.js 应用:
npm install winston-gelf-transporterconstwinston=require('winston');constWinstonGelf=require('winston-gelf-transporter');constlogger=winston.createLogger({transports:[newWinstonGelf({gelfPro:{adapterName:'udp',adapterOptions:{host:'Graylog服务器IP',port:12201}}})]});方法二:Filebeat 收集文件日志
# 在需要收集日志的服务器上安装 Filebeatcurl-fsSLhttps://artifacts.elastic.co/GPG-KEY-elasticsearch|sudoapt-keyadd-echo"deb https://artifacts.elastic.co/packages/8.x/apt stable main"|sudotee/etc/apt/sources.list.d/elastic-8.x.listsudoaptupdate&&sudoaptinstallfilebeatsudonano/etc/filebeat/filebeat.ymlfilebeat.inputs:-type:logenabled:truepaths:-/var/log/nginx/*.log-/opt/myapp/logs/*.logfields:service:myappenvironment:productionoutput.logstash:hosts:["Graylog服务器IP:5044"]sudosystemctlenable--nowfilebeat方法三:Syslog
# 把系统日志发送到 Graylogecho"*.* @Graylog服务器IP:514"|sudotee-a/etc/rsyslog.confsudosystemctl restart rsyslog搜索日志
Graylog 使用类 Lucene 语法搜索:
# 全文搜索 error # 按字段搜索 level:ERROR AND source:myapp # 时间范围 timestamp:[2026-04-01 TO 2026-04-29] # 组合条件 source:nginx AND (status:500 OR status:502) # 排除 NOT message:health_check创建告警
Alerts → Event Definitions → Create Event Definition配置示例:5 分钟内错误日志超过 10 条触发告警:
条件:Count 搜索:level:ERROR 时间窗口:5 分钟 阈值:> 10 通知方式:Email / Webhook(可以接 Slack、钉钉)Webhook 告警接微信/钉钉
Notifications → Create Notification → HTTP Notification URL: 钉钉机器人 Webhook URL{"msgtype":"text","text":{"content":"告警:${event.message}\n时间:${event.timestamp}"}}Graylog 的价值在于把原来分散的日志统一到一个地方,配合告警规则,很多线上问题在用户报告之前就能发现。日志保留 30 天,出了问题可以回溯历史,比临时 ssh 上去翻 log 文件效率高很多。