Loki 日志平台搭建

参考文档:
https://blog.csdn.net/tcy1429920627/article/details/109679363

Loki的GitHub地址:https://github.com/grafana/loki

配置文件官网地址:https://grafana.com/docs/loki/latest/installation/local/

Grafana下载官网:https://grafana.com/grafana/download

注意点

1. loki 与 promtail 的配置文件需要手动获取
	wget github

2. promtail 的配置文件需要修改 clients
	配置为 Loki服务器的ip地址 

3. 想要添加不同节点的机器, 需要在节点中部署 promtail 并指向loki

4. 不同 job 需要指定不同的 labels 与 __path__
	labels:
      job: xxx
      app: xxx
      __path__: /xx/xxx/*log 

5. grafana 是一个展示插件
	需要配置数据源, 才能正确展示查询
   
6. 生成日志文件
	echo "error May-20 15:21:14 === Started libdnf-0.39.1 ===" >> hawkey.log
    
7. 建议直接docker-compose 方式部署安装, 然后配置Grafana数据源使用即可

8. 文档中的服务器ip地址都已替换为1.1.1.1, 使用时请注意替换.

1. 二进制文件安装

启动与安装Grafana

mkdir /data/test_grafanna
cd /data/test_grafanna

#下载安装grafana命令,下列命令执行成功后。
wget https://dl.grafana.com/oss/release/grafana-7.3.6-1.x86_64.rpm
sudo yum -y install grafana-7.3.6-1.x86_64.rpm

#启动grafana,grafana会占用服务器3000端口
systemctl start grafana-server.service
systemctl status grafana-server.service

rm -f grafana-7.3.6-1.x86_64.rpm

启动 Promtail 与 loki

下载与安装 Promtail 与 loki
#下载压缩文件
curl -O -L "https://github.com/grafana/loki/releases/download/v2.0.0/loki-linux-amd64.zip"
curl -O -L "https://github.com/grafana/loki/releases/download/v2.0.0/promtail-linux-amd64.zip"

#解压文件
unzip "loki-linux-amd64.zip"
unzip "promtail-linux-amd64.zip"

#执行文件授权
chmod a+x "loki-linux-amd64"
chmod a+x "promtail-linux-amd64"

# 删除安装包
rm -f loki-linux-amd64.zip
rm -f promtail-linux-amd64.zip

下载 Loki 与 Promtail 的配置文件

查看 https://github.com/grafana/loki 项目, 根据目录找到对应的 yaml文件地址, 参考https://www.cnblogs.com/sanduzxcvbnm/p/14234953.html

wget  --no-check-certificate https://raw.githubusercontent.com/grafana/loki/master/cmd/loki/loki-local-config.yaml
wget  --no-check-certificate https://raw.githubusercontent.com/grafana/loki/master/clients/cmd/promtail/promtail-local-config.yaml
修改 Loki 与 Promtail 的配置文件
vim loki-local-config.yaml 
	# 去掉这几行, 否则会报错
	wal:
        enabled: true
        dir: /tmp/wal
        recover: true
        
vim promtail-local-config.yaml
	# 修改 clients, 将host改为服务器地址
	# 添加 scrape_configs 对应的 labels 进行日志收集
	
启动 Loki 与 Promtail
# 启动Loki命令  默认端口为 3100
nohup ./loki-linux-amd64 -config.file=loki-local-config.yaml  > loki.log 2>&1 &

# 到收集日志的服务器上配置 Promtail 并启动,传输文件到收集日志的服务器。 Promtail默认端口是9080
nohup ./promtail-linux-amd64 -config.file=promtail-local-config.yaml > promtail.log 2>&1 &

grafana 配置数据源

详见下方 

停止服务

- 停止 grafana 服务
	systemctl stop grafana-server.service

- 当前终端关闭 nuhup 任务
    jobs
        kill %1
        kill %2

- 清理进程
	ps -ef | grep loki
	ps -ef | grep promtail
		kill -9 
	

2. docker安装

官网: https://github.com/grafana/loki/blob/v1.5.0/docs/installation/docker.md

下载配置文件

mkdir -p /data/loki/config && cd /data/loki/config 

wget https://raw.githubusercontent.com/grafana/loki/v1.5.0/cmd/loki/loki-local-config.yaml -O loki-config.yaml

wget https://raw.githubusercontent.com/grafana/loki/v1.5.0/cmd/promtail/promtail-docker-config.yaml -O promtail-config.yaml

启动容器

运行 loki 容器
docker run -d --name loki \
-v /data/loki/config:/mnt/config \
-p 3100:3100 grafana/loki:1.5.0 \
-config.file=/mnt/config/loki-config.yaml

错误: failed parsing config: open /mnt/config/loki-config.yaml: permission denied

问题原因及解决办法
   原因是CentOS7中的安全模块selinux把权限禁掉了,至少有以下三种方式解决挂载的目录没有权限的问题:
   1.在运行容器的时候,给容器加特权,及加上 --privileged=true 参数:
   docker run -i -t -v /soft:/soft --privileged=true 686672a1d0cc /bin/bash
   2.临时关闭selinux:
   setenforce 0
   3.添加selinux规则,改变要挂载的目录的安全性文本
运行 promtail 容器

注意点:
启动容器时, 需要将日志所在文件夹映射至容器内部, 否则无法读取日志文件

docker run -d --name promtail \
-v /data/loki/config:/mnt/config \
-v /var/log:/var/log \
grafana/promtail:1.5.0 \
-config.file=/mnt/config/promtail-config.yaml

promtail作为日志收集代理可部署在任意要收集日志的节点上,配置文件中指定 loki 节点IP地址即可,另外需要挂载要收集的节点日志文件目录到 promtail 容器中。

运行 grafana 容器
docker run -d --name=grafana \
  --restart always \
  -p 3000:3000 \
  -v grafana-storage:/var/lib/grafana \
  grafana/grafana

确认开启状态

查看 loki 数据
http://1.1.1.1:3100/metrics
查看 loki 运行状态
http://1.1.1.1:3100/ready
# ready

如果想要收集指定目录及所有子目录下以.log结尾的日志文件,修改promtail-config.yaml 配置文件:

# vim promtail-config.yaml 
......
      __path__: /var/log/**/*.log

grafana 配置数据源

  • 详见下方配置数据源

    http://1.1.1.1:3000/
    

3. docker-compose安装

docker-compose 文件
https://raw.githubusercontent.com/grafana/loki/v1.5.0/production/docker-compose.yaml 

注意点:
	容器运行时, 需要将日志所在文件夹映射至容器内部, 否则无法读取日志文件

官方推荐安装

$ wget https://raw.githubusercontent.com/grafana/loki/v1.5.0/production/docker-compose.yaml -O docker-compose.yaml
$ docker-compose -f docker-compose.yaml up
下载配置文件
wget https://raw.githubusercontent.com/grafana/loki/v1.5.0/cmd/loki/loki-local-config.yaml -O loki-config.yaml

wget https://raw.githubusercontent.com/grafana/loki/v1.5.0/cmd/promtail/promtail-docker-config.yaml -O promtail-config.yaml
修改配置文件(同上)
vim loki-local-config.yaml 
	# 去掉这几行, 否则会报错
	wal:
        enabled: true
        dir: /tmp/wal
        recover: true
        
vim promtail-local-config.yaml
	# 修改 clients, 将host改为服务器地址
	# 添加 scrape_configs 对应的 labels 进行日志收集

自定义配置安装

问题点:
	使用 	multiline 控制多行合并采集, 注意缩进与正则
	
	一个奇怪的现象, 使用docker部署promtail采集, 如果发现loki中没有数据, 重启promtail容器后, 就又有了....
docker-compose.yaml
version: "3.6"

networks:
  loki:

services:
  loki:
    image: grafana/loki
    container_name: loki
    volumes:
      - $PWD:/etc/loki
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/loki-config.yaml
    networks:
      - loki

  promtail:
    image: grafana/promtail
    container_name: promtail
    volumes:
      - /var/log:/var/log
      - $PWD:/etc/promtail
      - /data/log/:/data/log/     # 该地址为映射 log 日志文件存放地址
    command: -config.file=/etc/promtail/promtail-config.yaml
    networks:
      - loki

  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - "3000:3000"
    networks:
      - loki

loki-config.yaml
auth_enabled: false

server:
  http_listen_port: 3100	# 这个不需要变化, 即使loki接收端口变, 他也不用改

ingester:
  lifecycler:
    address: 127.0.0.1
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
    final_sleep: 0s
  chunk_idle_period: 5m
  chunk_retain_period: 30s
  max_transfer_retries: 0

schema_config:
  configs:
    - from: 2021-06-04
      store: boltdb
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 168h

storage_config:
  boltdb:
    directory: /tmp/loki/index

  filesystem:
    directory: /tmp/loki/chunks

limits_config:
  enforce_metric_name: false
  reject_old_samples: true
  reject_old_samples_max_age: 168h
  ingestion_rate_mb: 15

chunk_store_config:
  max_look_back_period: 0s

table_manager:
  retention_deletes_enabled: false
  retention_period: 0s

promtail-config.yaml
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /etc/promtail/positions.yaml
  sync_period: 10

clients:
  - url: http://1.1.1.1:3100/loki/api/v1/push

scrape_configs:
  - job_name: go_vmp_server
    static_configs:
    - targets:
        - localhost
      labels:
        job: go_vmp_server
        app: go_vmp_server
        env: prod
        __path__: /data/log/test/*log
    pipeline_stages:
    - match:
        selector: '{job="go_vmp_server"}'
        stages:
          - regex:
              expression: '.*'
          - multiline:
              firstline: '^\[\d{4}-\d{2}-\d{2}'
              max_wait_time: 3s

启动

docker-compose up -d

4. Grafana 添加数据源

添加数据源

访问 Grafana web页面:http://1.1.1.1:3000/  进行登录(账号密码都是admin)
点击 DATA SOURCES => Loki 
填写 HTTP 地址, 数据源的访问地址(Lok:3100) => save
	可以设置每页展示的数量, Maximum lines 会展示最新的日志行, 避免浏览器崩溃. 
点击 Explore 即可查看日志了 

logQL 查询

可以基于文件名或标签查看:

{job="Promtail 设置的job名"}
 
{filename="配置中的日志文件名"}

5. 多节点设置

  • 多节点时 docker-compose.yaml 文件
version: "3.6"

services:

  promtail:
    image: grafana/promtail
    container_name: promtail
    volumes:
      - $PWD:/etc/promtail
      - /data/log:/data/log
    command: -config.file=/etc/promtail/promtail-config.yaml

  • promtail-config.yaml 文件
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /etc/promtail/positions.yaml
  sync_period: 10

clients:
  - url: http://1.1.1.1:3100/loki/api/v1/push

scrape_configs:
  - job_name: go_vmp_server_access
    static_configs:
    - targets:
        - localhost
      labels:
        job: go_vmp_server_access
        env: access
        __path__: /data/log/access/*log
    pipeline_stages:
    - match:
        selector: '{job="go_vmp_server_access"}'
        stages:
          - multiline:
              firstline: '^\[\d{4}-\d{2}-\d{2}'
              max_wait_time: 3s

  - job_name: go_vmp_server_app-out
    static_configs:
    - targets:
        - localhost
      labels:
        job: go_vmp_server_app-out
        env: app-out
        __path__: /data/log/app-out/*log
    pipeline_stages:
    - match:
        selector: '{job="go_vmp_server_app-out"}'
        stages:
          - multiline:
              firstline: '^\[\d{4}-\d{2}-\d{2}'
              max_wait_time: 3s

  - job_name: go_vmp_server_error
    static_configs:
    - targets:
        - localhost
      labels:
        job: go_vmp_server_error
        env: error
        __path__: /data/log/error/*log
    pipeline_stages:
    - match:
        selector: '{job="go_vmp_server_error"}'
        stages:
          - multiline:
              firstline: '^\[\d{4}-\d{2}-\d{2}'
              max_wait_time: 3s

注意点

在启动docker容器之后, 要注意, 当前配置文件的环境在哪. 比如loki的配置文件中的 server:http_listen_port: , 是docker容器内的端口, 无需和宿主机的端口同步
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐