服务器日志是排查故障的第一手资料,但传统ELK全家桶对小型团队来说资源消耗过高。Loki以对象存储为后端,索引开销远低于Elasticsearch,配合Promtail采集日志,能在几十MB内存的范围内完成整套日志平台搭建。本文记录一套面向Linux服务器的轻量日志收集方案,从部署到告警全覆盖。
轻量日志收集方案对比与选型依据
选型时主要对比三个维度:资源占用、查询能力和部署复杂度。ELK需要常驻至少4GB内存,Loki本体仅需512MB;查询层面Loki基于标签索引,对关键字检索场景够用,但不适合全文统计;部署上Loki+Promtail只有两个二进制文件,比ELK少一半组件。单机服务器和中小集群场景,Loki方案性价比明显更高。
Promtail日志采集器配置详解
Promtail负责从服务器抓取日志文件并打上标签。安装方式从GitHub releases下载对应架构的二进制即可。核心配置是scrape_configs段,声明采集路径与标签:
server:
http_listen_port: 9080
positions:
filename: /var/lib/promtail/positions.yaml
clients:
- url: http://loki.example.com:3100/loki/api/v1/push
scrape_configs:
- job_name: syslog
static_configs:
- targets: [localhost]
labels:
job: syslog
host: web-01
pipeline_stages:
- regex:
expression: "^(?P<level>\w+)\s+(?P<msg>.*)"
- labels:
level:
- timestamp:
source: time
format: RFC3339
regex与labels两个pipeline stage把日志中的级别字段提取为标签,之后Loki查询时可直接按level=error过滤。positions.yaml记录读取位置,Promtail重启后从断点续读,不会重复推送。
Loki服务器配置与数据留存策略
Loki以单二进制方式运行,使用本地文件系统存储日志数据。配置中需要关注保留时间与接收配置:
auth_enabled: false
server:
http_listen_port: 3100
common:
path_prefix: /var/lib/loki
storage:
filesystem:
chunks_directory: /var/lib/loki/chunks
rules_directory: /var/lib/loki/rules
replication_factor: 1
schema_config:
configs:
- from: 2024-01-01
store: tsdb
object_store: filesystem
schema: v13
# 索引保留21天,块数据保留30天
limits_config:
retention_period: 720h
retention_period设720小时即30天,配合索引保留策略,磁盘占用可控。多台服务器场景把loki与promtail版本统一,配置格式差异会导致推送失败。
日志查询与告警配置实战
日志查询在Loki的Explore界面完成,语法基于LogQL。常用查询示例:
{job="syslog"} |= "error"
{host="web-01"} |~ "status=5\d\d" | json | line_format "{{.request_time}} {{.msg}}"
告警集成方面,Loki的ruler功能可基于日志频率触发告警,配置一个规则文件:
groups:
- name: error-alerts
rules:
- alert: HighErrorRate
expr: sum(rate({job="app"} |= "ERROR"[5m])) > 10
for: 10m
labels:
severity: warning
annotations:
summary: 应用错误率过高
这套方案在2核4GB的云服务器上稳定运行半年以上,日均日志量300MB级别,内存占用始终控制在1GB内,配合Grafana仪表盘可直观查看全站日志分布。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-ri-zhi-fen-xi-shi-zhan-promtail-yu-loki-qing/