1. 为什么选择LokiPromtailRsyslogGrafana组合在运维工作中日志监控是必不可少的一环。传统的ELKElasticsearchLogstashKibana方案虽然功能强大但对于中小型团队来说资源消耗大、维护成本高的问题一直存在。我去年接手的一个项目就遇到了这个问题——服务器配置有限但需要监控20多台网络设备和10余台服务器的日志ELK跑起来直接把内存吃满了。后来发现了Grafana Labs推出的Loki方案实测下来确实轻量。这套组合中Loki负责日志存储和查询类似Elasticsearch的角色Promtail负责日志采集类似FilebeatRsyslog负责接收网络设备日志最后用大家熟悉的Grafana做可视化。最让我惊喜的是同样规模的日志量内存占用只有ELK的1/5左右。这套方案特别适合需要监控网络设备交换机、防火墙日志的场景服务器资源有限的中小型团队已经使用Grafana做监控希望统一监控界面的环境2. 环境准备与基础配置2.1 系统环境调优在开始安装前我们需要对系统做些基础优化。以CentOS 7为例其他Linux发行版操作类似# 关闭防火墙和SELinux生产环境请根据实际情况调整 systemctl stop firewalld systemctl disable firewalld sed -i s/enforcing/disabled/g /etc/selinux/config # 创建专用数据目录 mkdir -p /data/loki/{chunks,rules}这里有个坑我踩过如果SELinux没彻底禁用Promtail采集日志时会报权限错误。建议用getenforce命令确认返回结果是Disabled。2.2 组件下载与安装所有组件都可以从Grafana官网获取最新版本。我习惯先把需要的文件都下载好wget https://github.com/grafana/loki/releases/download/v2.8.0/loki-linux-amd64.zip wget https://github.com/grafana/loki/releases/download/v2.8.0/promtail-linux-amd64.zip解压时建议指定目录方便后续管理unzip loki-linux-amd64.zip -d /usr/local/bin/ unzip promtail-linux-amd64.zip -d /usr/local/bin/3. Loki配置详解3.1 基础配置Loki的配置文件决定了日志如何存储和检索。这是我的生产环境配置模板# /etc/loki/loki-config.yaml auth_enabled: false server: http_listen_port: 3100 grpc_listen_port: 9096 common: path_prefix: /data/loki storage: filesystem: chunks_directory: /data/loki/chunks rules_directory: /data/loki/rules replication_factor: 1 ring: instance_addr: 192.168.1.100 # 改为你的服务器IP schema_config: configs: - from: 2020-10-24 store: boltdb-shipper object_store: filesystem schema: v11 index: prefix: index_ period: 24h几个关键参数说明chunks_directory日志数据块存储位置replication_factor单机部署设为1集群环境需要调整schema_config决定了索引如何存储filesystem模式最适合轻量部署3.2 服务化运行用systemd管理Loki服务最方便# 创建专用用户 useradd -r -s /sbin/nologin loki # 创建systemd服务文件 cat /lib/systemd/system/loki.service EOF [Unit] DescriptionLoki service Afternetwork.target [Service] Typesimple Userloki ExecStart/usr/local/bin/loki-linux-amd64 -config.file /etc/loki/loki-config.yaml [Install] WantedBymulti-user.target EOF启动前记得设置目录权限chown -R loki:loki /etc/loki /data/loki systemctl daemon-reload systemctl start loki systemctl enable loki4. Promtail配置实战4.1 采集本地日志Promtail的配置决定了采集哪些日志以及如何打标签。这是我的多日志源配置示例# /etc/promtail/promtail-config.yaml server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://localhost:3100/loki/api/v1/push scrape_configs: - job_name: system static_configs: - targets: [localhost] labels: job: varlogs __path__: /var/log/*.log - job_name: network static_configs: - targets: [localhost] labels: job: network env: prod __path__: /var/log/network/*.log重点说明positions文件记录采集进度重启后不会重复采集__path__支持通配符如/var/log/*.log会匹配所有.log文件labels是查询时的关键建议按业务逻辑设计4.2 处理网络设备日志对于网络设备日志通常需要先通过Rsyslog接收。Promtail配置需要与Rsyslog输出路径匹配- job_name: cisco static_configs: - targets: [localhost] labels: job: firewall vendor: cisco __path__: /var/log/network/cisco-*.log4.3 权限管理Promtail需要对日志文件有读取权限useradd -r -s /sbin/nologin promtail chown -R promtail:promtail /etc/promtail /tmp/positions.yaml chmod -R 644 /var/log/network/*.log5. Rsyslog配置技巧5.1 接收网络设备日志Rsyslog的配置决定了如何接收和存储网络设备发来的日志# 在/etc/rsyslog.conf末尾添加 module(loadimudp) input(typeimudp port514) module(loadimtcp) input(typeimtcp port514) $template DynamicFile,/var/log/network/%HOSTNAME%-%FROMHOST-IP%.log *.* ?DynamicFile ~这个配置会同时启用TCP/UDP 514端口按设备主机名IP命名日志文件 ~表示不继续处理这些日志5.2 华为设备配置示例华为交换机需要这样配置日志发送info-center loghost source Vlanif100 info-center loghost 192.168.1.100 info-center source default channel loghost log level informational5.3 日志轮转管理长时间运行会产生大量日志建议用logrotate管理# /etc/logrotate.d/network-logs /var/log/network/*.log { daily rotate 7 missingok notifempty sharedscripts postrotate /bin/kill -HUP cat /var/run/syslogd.pid 2 /dev/null 2 /dev/null || true endscript }6. Grafana可视化实战6.1 添加Loki数据源在Grafana中添加Loki数据源进入Configuration → Data Sources选择LokiURL填写http://localhost:3100保存并测试连接6.2 常用查询示例在Explore页面可以执行日志查询{jobnetwork}查看所有网络设备日志{hostname~switch.*}查询主机名包含switch的设备{jobcisco} | error查找Cisco设备中的错误日志6.3 制作监控看板创建一个网络设备监控看板新建Dashboard → Add panel选择Logs可视化类型查询语句输入{jobnetwork}添加Overrides规则对不同厂商日志着色vendorcisco→ 蓝色vendorhuawei→ 红色7. 性能优化与问题排查7.1 资源占用对比在我的测试环境中监控30台设备时的资源占用内存Loki约200MBPromtail约50MBCPU平均负载0.5磁盘日志压缩比约3:17.2 常见问题解决问题1Promtail报权限错误解决方法setenforce 0 # 临时关闭SELinux chmod 644 /var/log/network/*.log问题2Loki查询超时修改Loki配置query_frontend: max_query_length: 72h parallelise_shardable_queries: true问题3网络设备日志格式混乱在Rsyslog中添加模板$template CiscoFormat,%timestamp% %hostname% %msg%\n if $fromhost-ip 192.168.1.1 then { action(typeomfile file/var/log/network/cisco.log templateCiscoFormat) stop }这套轻量级日志方案在我负责的三个项目中已经稳定运行超过半年特别是在资源受限的环境下表现优异。对于刚开始搭建的同学建议先从少量设备开始测试逐步完善标签体系。记得定期检查磁盘空间重要的日志可以配置报警规则。