Docker部署Loki+Grafana+Vector实现全服务器日志监控(含N8N/SSH/Fail2ban监控)
Docker部署Loki+Grafana+Vector实现全服务器日志监控(含N8N/SSH/Fail2ban监控)
一、前言
很多自建服务玩家、服务器运维新手,都想把Docker容器日志(N8N/Airflow等)、服务器SSH登录日志、Fail2ban攻防拦截日志统一收集,在Grafana图形界面集中查看、检索、回溯。
本文全程小白向,无复杂命令、无专业术语绕弯,手把手教你用Docker Compose 一键部署 Loki + Grafana + Vector,实现:
- 所有Docker容器日志自动采集
- 服务器SSH登录/失败日志收集
- Fail2ban拦截黑客暴力破解日志收集
- Grafana可视化检索、按关键词过滤、按时间回溯
二、架构原理
- Vector:日志采集搬运工,负责抓取容器日志、系统日志,转发给Loki
- Loki:日志存储仓库,专门存放所有日志,不占大量磁盘
- Grafana:可视化面板,用来查询、看日志、做监控面板
简单理解:Vector收日志 → Loki存日志 → Grafana看日志
三、前置准备
- 一台Linux云服务器(Ubuntu/Debian均可)
- 已安装
docker和docker-compose - 服务器开放3000(Grafana)、3100(Loki)端口
四、目录准备
新建专属部署目录,后续所有配置都放这里:
mkdir-p~/apps/log-monitorcd~/apps/log-monitor五、编写docker-compose.yml
在log-monitor目录创建docker-compose.yml,复制以下内容直接使用:
version:"3.8"services:loki:image:grafana/loki:2.9.0container_name:lokirestart:alwaysports:-"3100:3100"volumes:-./loki-data:/lokicommand:-config.file=/etc/loki/local-config.yamlgrafana:image:grafana/grafana:latestcontainer_name:grafanarestart:alwaysports:-"3000:3000"volumes:-./grafana-data:/var/lib/grafanaenvironment:-GF_SECURITY_ADMIN_PASSWORD=adminXXXXXdepends_on:-lokivector:image:timberio/vector:0.55.0-alpinecontainer_name:vectorrestart:alwaysvolumes:-./vector.toml:/etc/vector/vector.toml-/var/run/docker.sock:/var/run/docker.sock-/var/log:/host/var/log:ro说明:
- 挂载
docker.sock:让Vector能监听所有Docker容器日志 - 挂载
/var/log:ro:只读挂载系统日志目录,用来采集auth.log、fail2ban.log - Grafana默认账号:
admin密码:adminxxx,可自行修改
六、编写Vector核心配置 vector.toml
在同目录创建vector.toml,最终稳定可用版,无语法报错、无429限流:
data_dir = "/var/lib/vector" # 1. 采集所有Docker容器日志 [sources.docker_logs] type = "docker_logs" docker_host = "unix:///var/run/docker.sock" # 2. 采集服务器SSH登录日志 auth.log [sources.host_auth] type = "file" include = ["/host/var/log/auth.log"] read_from = "end" # 3. 采集Fail2ban拦截日志 [sources.fail2ban] type = "file" include = ["/host/var/log/fail2ban.log"] read_from = "end" # 输出所有日志到Loki [sinks.loki] type = "loki" inputs = ["docker_logs", "host_auth", "fail2ban"] endpoint = "http://loki:3100" encoding.codec = "json" # 固定标签,保证Loki正常接收 labels.job = "vector"配置关键点小白解释:
read_from = "end":只采集后续新产生日志,不加载海量历史日志,避免Loki被限流报429错误- 三个数据源:容器日志、SSH日志、Fail2ban日志,统一发给Loki
七、启动整套服务
在log-monitor目录执行:
dockercompose up-d等待1分钟,三个容器全部后台启动完成。
查看Vector运行日志,确认无报错:
dockercompose logs-fvector出现Healthcheck passed即为正常启动。
八、配置Grafana对接Loki
- 浏览器访问:
服务器IP:3000 - 账号
admin,密码admin123456 - 左侧菜单 →Connections → Data sources
- 点击Add data source→ 选择Loki
- URL填写:
http://loki:3100 - 拉到最下方 →Save & test,显示成功即可
九、日常日志查询用法(小白直接复制)
进入Grafana左侧Explore,数据源选Loki,直接用下面语句查询:
1. 查看所有采集的日志
{job="vector"}2. 只看N8N容器日志
{container="n8n"}3. 只看SSH登录、登录失败日志
{job="vector"} |= "sshd"4. 只看Fail2ban黑客拦截、封禁IP日志
{job="vector"} |= "fail2ban"十、常见问题避坑(全程踩坑总结)
问题1:Grafana打开日志一片空白,明明Vector已采集
原因:Grafana默认只显示前1000行,Docker容器日志太多,把系统日志挤没了
解决:
- 右上角Limit默认1000,改成10000
- 不用全量查询,直接用
|= "关键词"过滤
问题2:Vector报 429 Too Many Requests
原因:一次性读取海量历史日志,Loki限流拒绝
解决:配置里统一用read_from = "end"只收集新日志,不加载历史
问题3:看不到Fail2ban/SSH日志,Vector能读到文件但不显示
原因1:日志文件权限限制,Vector无读取权限
执行命令开放权限:
sudochmod644/var/log/auth.log /var/log/fail2ban.log原因2:混用动态标签模板,Loki解析失败
解决:直接用本文极简配置,不搞复杂标签模板,只用固定job="vector"
问题4:Vector配置文件报TOML语法错误
原因:缩进、冒号格式不对
解决:直接复制本文完整vector.toml,不要手动改格式
十一、使用总结
- 整套架构一条命令启动,无需复杂安装
- 自动全覆盖:Docker容器日志 + SSH安全日志 + Fail2ban攻防日志
- 不用登录服务器看日志,浏览器随时随地检索、回溯
- 只需复制配置,无需懂日志原理即可落地使用
- 避开了429限流、标签解析、行数限制、权限不足等所有坑
