Noname
Noname

使用 Loki 日志系统来集中存储和查询网络设备日志

前言

本例将在一台 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

  1. 先配置服务器的 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,否则防火墙会发送所有日志,包括连接日志。

https://blog.cpmsxe.net/wp-content/uploads/2024/01/wp_editor_md_08874db77fdc58d1c075552c711e2b9b.jpg

3. 检查日志是否有传输过来。防火墙保存一下配置,这时候可以查看/var/log/rsyslog/下有无产生日志文件,正常情况下就应该有文件了。如果没有需要检查网络和防火墙。防火墙需要配置一条策略允许 local 区域对外连接。没问题话就可以继续配置 Loki 了。
https://blog.cpmsxe.net/wp-content/uploads/2024/01/wp_editor_md_910cba28ee7e2a913e1bc6d8771febb4.jpg

如果有其他交换机等设备,也可以按照相应的方法配置 syslog,只是记得日志服务器的 rsyslog 需要配置对应的地址段或者主机

配置 Loki 相关服务

  1. 先创建相关文件夹用于存放数据和配置
mkdir /root/loki
cd /root/loki
mkdir -p ./config/loki
mkdir ./config/promtail
mkdir ./data
chmod -R 777 ./data
#需要给 data 文件夹777权限,否则 grafana 和 loki 容器会因为无法创建文件夹而起不来
  1. 准备 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
  1. 准备 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
  1. 准备 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下所有子文件夹下的所有文件,此目录已经映射到宿主机文件系统
  1. 拉取镜像并启动相关容器
    docker compose up -d
  2. 查看容器状态,看看所有容器是否正常启动了
    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 来访问日志

https://blog.cpmsxe.net/wp-content/uploads/2024/01/wp_editor_md_fce3486917efaeddeafc938dcd2a5534.jpg

选择对应的日志文件,设置时间段,点击Run Query查询,即可在下面看到日志了
https://blog.cpmsxe.net/wp-content/uploads/2024/01/wp_editor_md_9734d6545a4308a6c58e86dfd5291c9b.jpg

也可以点击右上角的Live进入实时模式,有新日志送过来立即显示
https://blog.cpmsxe.net/wp-content/uploads/2024/01/wp_editor_md_c36e89d33d0e41a2efb43e74e4a4e81a.jpg

部署完成

没有标签
首页      Docker      使用 Loki 日志系统来集中存储和查询网络设备日志

发表回复

textsms
account_circle
email

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理

Noname

使用 Loki 日志系统来集中存储和查询网络设备日志
前言 本例将在一台 Rocky Linux 9 服务器上,通过 Docker 部署一套 Loki 日志系统,将一台华为 USG 6500E 防火墙的业务日志集中存储,并使用 Grafana 进行日志管理查询。 Loki 介绍 先…
扫描二维码继续阅读
2024-01-05