Table of Contents
前言
本例将在一台 Rocky Linux 9 服务器上,通过 Docker 部署一套 Loki 日志系统,将一台华为 USG 6500E 防火墙的业务日志集中存储,并使用 Grafana 进行日志管理查询。
Loki 介绍
先抄一段网上的介绍: Loki 是 Grafana Labs 团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统。它的设计非常经济高效且易于操作,因为它不会为日志内容编制索引,而是为每个日志流编制一组标签,专门为 Prometheus 和 Kubernetes 用户做了相关优化。该项目受 Prometheus 启发,官方的介绍就是:Like Prometheus,But For Logs. 类似于 Prometheus 的日志系统。项目地址
简单介绍一下 Loki 的架构,Loki 有3个组件:
loki: 存储日志,并对外提供接口
promtail: 搜集本地日志文件,推送到loki(相当于一个代理程序,一般来说部署在待收集日志的机器上,本例只需要在日志服务器上部署即可)
grafana: 访问 loki 接口,查询和展示数据
流程
防火墙通过 syslog 将日志吐到服务器的 rsyslog,以纯文本写入本地文件。再由 promtail 采集,送至 loki 存储。用户再通过访问 grafana 来访问日志。
防火墙IP: 192.168.100.254
日志服务器IP: 192.168.100.98
准备
首先假设服务器上已经准备好了 Docker 和 Docker Compose 环境,并且服务器可以连通外网。我们这里先配置防火墙放通相关的端口
firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" port port=3000 protocol=tcp accept'
firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" port port=3100 protocol=tcp accept'
firewall-cmd --permanent --add-service syslog
firewall-cmd --reload
由于重载了 firewall,这时候还建议重启一下 Docker 守护进程(容器也会重启),防止容器内断网
systemctl restart docker
配置服务器和防火墙的 syslog
- 先配置服务器的 rsyslog。将接收到的日志按照
IP/主机名_日期.log
的格式命名。
编辑/etc/rsyslog.conf
文件,先取消以下内容的注释,也可以直接写到配置文件的最下面,开启监听UDP的514端口,用于接收日志:
module(load="imudp")
input(type="imudp" port="514")
然后在配置文件最下面追加,按照不同IP地址写入日志文件:
$template fromRemote,"/var/log/rsyslog/%fromhost-ip%/%HOSTNAME%_%$YEAR%-%$MONTH%-%$DAY%.log"
:fromhost-ip, startswith,"192.168.100." ?fromRemote
#也可以直接写明具体IP地址,上面的写法可以匹配整个IP段
#:fromhost-ip,isequal, "192.168.100.254" ?fromRemote
重启 rsyslog 使配置生效
systemctl restart rsyslog
2. 配置华为防火墙,注意修改 source 发送接口(发送日志使用的接口),也可以直接写IP地址
system-view
info-center source default channel 2 log level warning
info-center loghost source Vlanif100
info-center loghost 192.168.100.98
也可以通过图形界面配置,但是还是要注意手动配置log level warning
,否则防火墙会发送所有日志,包括连接日志。
3. 检查日志是否有传输过来。防火墙保存一下配置,这时候可以查看/var/log/rsyslog/
下有无产生日志文件,正常情况下就应该有文件了。如果没有需要检查网络和防火墙。防火墙需要配置一条策略允许 local 区域对外连接。没问题话就可以继续配置 Loki 了。
如果有其他交换机等设备,也可以按照相应的方法配置 syslog,只是记得日志服务器的 rsyslog 需要配置对应的地址段或者主机
配置 Loki 相关服务
- 先创建相关文件夹用于存放数据和配置
mkdir /root/loki
cd /root/loki
mkdir -p ./config/loki
mkdir ./config/promtail
mkdir ./data
chmod -R 777 ./data
#需要给 data 文件夹777权限,否则 grafana 和 loki 容器会因为无法创建文件夹而起不来
- 准备 docker-compose.yaml 文件,将以下内容写入
./docker-compose.yaml
version: "3"
networks:
loki:
services:
loki:
image: grafana/loki:2.9.0
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
volumes:
- ./config/loki/local-config.yaml:/etc/loki/local-config.yaml
- ./data/loki:/loki
networks:
- loki
promtail:
image: grafana/promtail:2.9.0
volumes:
- /var/log:/var/log
- ./config/promtail/config.yml:/etc/promtail/config.yml
command: -config.file=/etc/promtail/config.yml
networks:
- loki
grafana:
environment:
- GF_PATHS_PROVISIONING=/etc/grafana/provisioning
- GF_AUTH_ANONYMOUS_ENABLED=false
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
entrypoint:
- sh
- -euc
- |
mkdir -p /etc/grafana/provisioning/datasources
cat <<EOF > /etc/grafana/provisioning/datasources/ds.yaml
apiVersion: 1
datasources:
- name: Loki
type: loki
access: proxy
orgId: 1
url: http://loki:3100
basicAuth: false
isDefault: true
version: 1
editable: false
EOF
/run.sh
image: grafana/grafana:latest
volumes:
- ./data/grafana:/var/lib/grafana
ports:
- "3000:3000"
networks:
- loki
- 准备 loki 配置文件,将以下内容写入
./config/loki/local-config.yaml
auth_enabled: false
server:
http_listen_port: 3100
common:
path_prefix: /loki
storage:
filesystem:
chunks_directory: /loki/chunks
rules_directory: /loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
schema_config:
configs:
- from: 2020-10-24
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
ruler:
alertmanager_url: http://localhost:9093
# 防止查询时出现 too many outstanding requests 错误
query_scheduler:
max_outstanding_requests_per_tenant: 10000
- 准备 promtail 配置文件,将以下内容写入
./config/promtail/config.yml
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlog
__path__: /var/log/rsyslog/**/*
#采集rsyslog下所有子文件夹下的所有文件,此目录已经映射到宿主机文件系统
- 拉取镜像并启动相关容器
docker compose up -d
- 查看容器状态,看看所有容器是否正常启动了
docker ps -a
查看日志
接下来可以试一下访问了,先看看 Loki 是否就绪
http://192.168.100.98:3100/ready
如果出现Ingester not ready: waiting for 15s after being ready
的提示请等待几十秒后再访问试试,直到提示 ready
然后访问 Grafana
http://192.168.100.98:3000
使用默认的用户名和密码admin/admin
登录,根据需要修改默认密码。由于我们已经在docker-compose文件里配置了 Grafana 的默认数据源了,所以无需再配置数据源。我们可以直接访问 Explore 来访问日志
选择对应的日志文件,设置时间段,点击Run Query
查询,即可在下面看到日志了
也可以点击右上角的Live
进入实时模式,有新日志送过来立即显示
部署完成
发表回复