服务器日志太分散不好查?我用Promtail+Loki+Grafana把采集、查询和分析串起来了

服务器日志太分散不好查?我用Promtail+Loki+Grafana把采集、查询和分析串起来了

前言

服务器一多,日志最先失控。单机时代还能靠 tail -f 临时看两眼,到了多服务、多目录甚至多主机环境,真正麻烦的是:日志分散在哪里、哪个服务出了错、同一时间段发生了什么,怎么把这些信息集中起来查。

这次我把 Promtail、Loki 和 Grafana 这条 PLG 日志链完整跑一遍。先按 CentOS 7 环境分别部署 Loki、Grafana 和 Promtail,确认日志能够从采集端推到 Loki,再在 Grafana 里完成查询。

随后再补一套 Docker Compose 一体化方案,并实际写入测试日志、JSON 结构化日志、Nginx 和 Auth 多日志源,继续用 LogQL 做过滤和统计。

最后把 Grafana 的 3000 端口提供给外部设备访问,并从随机地址切换到固定二级子域名。整篇重点不是简单说"PLG 比 ELK 更轻",而是把采集 → 存储 → 查询 → 结构化解析 → 多日志源 → 远程访问这条链真正跑通。

这类日志平台真正有价值的地方,也不是把三个组件装在一起,而是出了问题以后能沿着同一条链去查:哪台机器、哪个服务、哪个时间段、哪类错误,都尽量从统一入口定位。等日志量逐渐上来以后,这种集中查询会比逐台服务器翻文件更省时间。

而且后面如果继续增加服务,只需要继续补采集规则和标签,不必重新换一套日志平台。

1 先把Promtail、Loki、Grafana的分工弄清楚

这三个组件各自负责不同的一层。

Promtail:采集日志

它负责盯住指定日志文件,把日志附上 job、host 等标签,再推给Loki。

Loki:存储和查询日志

它不会像传统全文检索系统那样给每一行日志做完整全文索引,而是更依赖标签组织日志流。

Grafana:查询和可视化

最终人在浏览器里使用Grafana,通过Loki数据源和LogQL查看日志、筛选错误、做统计。

整条链可以先记成:

日志文件 → Promtail → Loki → Grafana

2 这套日志链适合什么场景

比较常见的使用方式包括:

  • 多服务日志集中查看;
  • 按服务名、主机、环境筛选;
  • 实时排障;
  • 结构化JSON日志查询;
  • Nginx、Auth、应用日志统一查看;
  • 基于LogQL做趋势和错误统计;
  • 后续继续结合Grafana告警。

如果主要需求是复杂全文检索、重度文本分析,仍然要根据实际场景选择日志方案。

PLG更适合标签先过滤、再查看日志内容的使用方式。

3 先看几个典型LogQL例子

按标签过滤:

{job="app"} |= "error"

正则匹配:

{job="nginx"} |~ "404|500"

统计日志速率:

rate({job="api"}[5m])

后面还会继续测试JSON解析和多日志源。

4 环境准备:CentOS 7

这次环境按:

  • CentOS Linux 7.x;
  • root或sudo权限;
  • 服务器可以下载安装包;

来准备。

源配置里需要涉及:

  • Loki;
  • Promtail;
  • Grafana;

以及后续使用的相关端口。

先按当前操作关闭firewalld,或者自行改成开放需要的端口:

shell 复制代码
systemctl stop firewalld
systemctl disable firewalld
# 或使用 iptables/firewalld 开放端口

如果是长期生产环境,更适合按实际端口做最小范围放行,而不是为了省事一直关闭防火墙。

5 安装基础工具

执行:

shell 复制代码
yum update -y
yum install -y wget tar curl vim net-tools

这一步准备:

  • wget;
  • tar;
  • curl;
  • vim;
  • net-tools。

6 可选:创建Loki专用用户

执行:

shell 复制代码
useradd -r -s /sbin/nologin loki

如果后面完全按自己的权限模型运行,也可以再调整目录属主和启动方式。

7 第一条部署路线:先手动安装Loki

这部分先把Loki独立跑起来。

进入目录并下载:

shell 复制代码
cd /app/loki
curl -O -L "https://github.com/grafana/loki/releases/download/v1.5.0/loki-linux-amd64.zip" 

页面:

这里文字说明与实际下载地址中的版本号不完全一致。

为了保持已经跑通过程不变,命令和下载地址按现有记录保留,后续运行也以实际下载到的二进制为准。

8 解压Loki

执行:

shell 复制代码
unzip loki-linux-amd64.zip

结果:

9 创建Loki数据目录

执行:

shell 复制代码
mkdir  /data/loki
mkdir  /data/loki/{chunks,index}

结果:

这套配置把数据放在:

  • /data/loki/index
  • /data/loki/chunks

后面配置文件会直接引用这两个目录。

10 创建Loki配置文件

编辑:

shell 复制代码
vi config.yaml

配置保持如下:

shell 复制代码
auth_enabled: false
server:
  http_listen_port: 8094
ingester:
  lifecycler:
    address: 192.168.42.140 #日志服务器ip,即本机地址
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
    final_sleep: 0s
  chunk_idle_period: 5m
  chunk_retain_period: 30s
schema_config:
  configs:
  - from: 2024-04-01
    store: boltdb
    object_store: filesystem
    schema: v11
    index:
      prefix: index_
      period: 168h   #每张表的时间范围7天
storage_config:
  boltdb:
    directory: /data/loki/index   #索引文件存储地址
  filesystem:
    directory: /data/loki/chunks  #块存储地址
limits_config:
  enforce_metric_name: false
  reject_old_samples: true
  reject_old_samples_max_age: 168h
chunk_store_config:
  max_look_back_period: 168h

table_manager:
  retention_deletes_enabled: true
  retention_period: 168h   #表的保留期7天

页面:

这里最关键的几项是:

  • HTTP监听:8094
  • 本机地址:192.168.42.140
  • replication_factor:1
  • 索引目录:/data/loki/index
  • chunk目录:/data/loki/chunks
  • 保留期:168h

也就是先按单机、本地文件系统方式把Loki跑通。

11 给Loki准备启动脚本

创建:

shell 复制代码
vi start.sh

写入:

shell 复制代码
#!/bin/bash
nohup ./loki-linux-amd64 -config.file=./config.yaml >./server.log 2>&1 &
echo "$!" > pid

再创建关闭脚本:

shell 复制代码
vi shutdown.sh

写入:

shell 复制代码
#!/bin/bash
kill -9 `cat pid`
echo "关闭成功!"

脚本页面:

12 启动Loki并看日志

执行:

shell 复制代码
sh start.sh

然后查看:

shell 复制代码
tail -200f server.log

运行结果:

做到这里,Loki这一层已经具备接收Promtail日志的基础。

13 接下来安装Grafana

这套流程先处理CentOS上的防火墙和SELinux:

shell 复制代码
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

同样,长期环境更建议根据自己的安全策略处理端口和SELinux规则,不要机械理解成"必须永久关闭"。

14 Grafana不同系统安装方式

Ubuntu / Debian方式:

shell 复制代码
sudo apt-get install -y adduser libfontconfig1 musl
wget https://dl.grafana.com/enterprise/release/grafana-enterprise_12.1.0_amd64.deb
sudo dpkg -i grafana-enterprise_12.1.0_amd64.deb

Standalone Linux Binaries方式:

shell 复制代码
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-12.1.0.linux-amd64.tar.gz
tar -zxvf grafana-enterprise-12.1.0.linux-amd64.tar.gz

Red Hat、CentOS、RHEL、Fedora方式:

shell 复制代码
sudo yum install -y https://dl.grafana.com/enterprise/release/grafana-enterprise-12.1.0-1.x86_64.rpm

OpenSUSE / SUSE方式:

shell 复制代码
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-12.1.0-1.x86_64.rpm
sudo rpm -Uvh grafana-enterprise-12.1.0-1.x86_64.rpm

这篇实际使用的是CentOS,所以真正执行的是:

shell 复制代码
sudo yum install -y https://dl.grafana.com/enterprise/release/grafana-enterprise-12.1.0-1.x86_64.rpm

15 启动Grafana并设置开机自启

执行:

shell 复制代码
systemctl restart grafana-server
systemctl enable grafana-server

查看版本:

shell 复制代码
grafana-cli -version

结果:

16 浏览器打开Grafana

访问:

shell 复制代码
ip:3000

页面:

第一次登录默认账号密码:

admin / admin

登录页:

认证后修改密码:

进入后台:

如果后面准备远程访问,这一步更不能继续保留默认密码。

17 再安装Promtail

创建安装目录后下载:

shell 复制代码
cd /app/promtail
curl -O -L "https://github.com/grafana/loki/releases/download/v1.5.0/promtail-linux-amd64.zip"

解压:

shell 复制代码
unzip promtail-linux-amd64.zip

结果:

18 配置Promtail采集日志

编辑:

shell 复制代码
vi promtail.yaml

配置保持如下:

shell 复制代码
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: ./positions.yaml

clients:
  - url: http://192.168.42.140:8094/loki/api/v1/push #日志服务器loki地址和端口

scrape_configs:
#ucenter1
 - job_name: zcbackend-172.29.21.22-1
   static_configs:
   - targets:
       - 192.168.42.140
   - labels:
      job: zcbachend-172.29.21.22-1
      host: 192.168.42.140
      __path__: /jiuqi/zichan/zichanyitihuazhenghexiangmu-8084/backend/server.log  #本机日志路径

页面:

这里Promtail做了三件事:

  1. 自己监听 9080;
  2. 把日志推到 192.168.42.140:8094;
  3. 读取指定的 server.log 路径。

真正需要按自己环境变化的通常是:

  • Loki地址;
  • job名称;
  • host标签;
  • __path__日志文件路径。

19 给Promtail准备启动脚本

创建:

shell 复制代码
vi start.sh

写入:

shell 复制代码
#!/bin/bash
nohup ./promtail-linux-amd64 -config.file=./promtail.yaml >./server.log 2>&1 &
echo "$!" > pid

再创建关闭脚本:

shell 复制代码
vi shutdown.sh

页面:

20 启动Promtail并看运行日志

执行:

shell 复制代码
sh start.sh

继续查看:

shell 复制代码
tail -200f server.log

结果:

做到这里,手动部署路线已经形成:

应用日志 → Promtail → Loki

后面再把Loki接进Grafana。

21 第二条部署路线:Docker一体化跑PLG

如果不想分别管理三个组件,这篇还保留了一套Docker Compose方案。

先检查Docker:

shell 复制代码
docker --version

结果:

22 创建Docker部署目录

执行:

shell 复制代码
mkdir -p /docker/do
chmod -R 777 /do

这里按现有命令保留目录和权限设置。

23 先写Loki和Promtail配置

执行:

shell 复制代码
mkdir -p /docker/do/loki
# 创建配置文件
cat > /docker/do/loki/config.yml <<EOF
 auth_enabled: false

 server:
   http_listen_port: 3100

 common:
   path_prefix: /tmp/loki
   storage:
     filesystem:
       directory: /tmp/loki/chunks
   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
 EOF

# 创建目录
mkdir -p /docker/do/promtail

# 创建配置文件
# 创建配置文件
cat > /docker/do/promtail/config.yml <<EOF
 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: varlogs
           __path__: /var/log/*.log
   - job_name: test
     static_configs:
       - targets:
           - localhost
         labels:
           job: test
           __path__: /var/log/test.log
 EOF

这组命令一次创建:

  • /docker/do/loki/config.yml
  • /docker/do/promtail/config.yml

Docker路线中使用:

  • Loki:3100
  • Promtail:9080

Promtail默认采集:

  • /var/log/*.log
  • /var/log/test.log

24 创建docker-compose.yml

编辑:

shell 复制代码
vi docker-compose.yml

写入:

shell 复制代码
version: "3"

networks:
  loki:

services:
  loki:
    image: grafana/loki:2.9.10
    ports:
      - "3100:3100"
    volumes:
      - ./loki/config.yml:/etc/loki/config.yml          # 👈 挂载配置
    command: -config.file=/etc/loki/config.yml          # 👈 路径匹配
    networks:
      - loki

  promtail:
    image: grafana/promtail:2.9.10
    volumes:
      - /var/log:/var/log
      - ./promtail/config.yml:/etc/promtail/config.yml  # 👈 挂载配置
    command: -config.file=/etc/promtail/config.yml      # 👈 路径匹配
    networks:
      - loki
    user: "root"                                        # 👈 关键!避免权限问题

  grafana:
    environment:
      - GF_PATHS_PROVISIONING=/etc/grafana/provisioning
      - GF_AUTH_ANONYMOUS_ENABLED=true
      - 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
    ports:
      - "3000:3000"
    networks:
      - loki

页面:

Compose里包含:

  • grafana/loki:2.9.10
  • grafana/promtail:2.9.10
  • grafana/grafana:latest

端口主要是:

  • Loki:3100
  • Grafana:3000

Promtail则通过Docker网络把日志推到:

http://loki:3100/loki/api/v1/push

25 这里有一项安全配置需要特别注意

这份Compose里保留了:

  • GF_AUTH_ANONYMOUS_ENABLED=true
  • GF_AUTH_ANONYMOUS_ORG_ROLE=Admin

也就是开启匿名访问,并给匿名用户Admin角色。

这对快速测试比较省事,但如果后面把Grafana直接开放到公网,这个设置就属于非常高风险配置。

因为技术参数按这套操作保留,所以正文不改Compose。

但长期远程使用时,应重新评估Grafana身份验证和匿名权限,不要把"公网能打开"直接等同于"可以安全长期使用"。

26 启动PLG容器

执行:

shell 复制代码
docker-compose up -d

结果:

部署状态:

做到这里,Docker路线的三个组件已经启动。

27 在Grafana里添加Loki数据源

先登录Grafana:

进入添加数据源:

搜索:

Loki

测试连接:

连接成功以后,Grafana就可以开始查询Loki里的日志。

28 不要停在"数据源连接成功",继续写一条测试日志

执行:

shell 复制代码
echo "Test log entry at $(date)" >> /var/log/test.log

这会向:

/var/log/test.log

追加一条测试内容。

29 先从Loki API直接查询

执行:

shell 复制代码
curl -g 'http://localhost:3100/loki/api/v1/query?query={job="test"}&limit=5'

结果:

如果响应中的 values 已经出现内容,就可以确认:

Promtail → Loki

这条链确实有数据流入。

30 再从Grafana Explore查询

进入Grafana:

  • Explore
  • 数据源选择Loki

查询:

shell 复制代码
{job="test"}

运行结果:

到这里完整链路才是:

日志文件 → Promtail → Loki → Grafana

而不只是"容器都显示Up"。

31 接下来模拟真实应用JSON日志

写入:

shell 复制代码
# 模拟一个 Web 服务日志
cat > /var/log/app.json <<'EOF'
{"level":"info","ts":"2026-06-04T12:00:00Z","msg":"User login","user_id":1001,"ip":"192.168.1.10","method":"POST","path":"/login","status":200}
{"level":"error","ts":"2026-06-04T12:01:05Z","msg":"DB timeout","user_id":1002,"ip":"192.168.1.11","method":"GET","path":"/profile","status":500,"error":"context deadline exceeded"}
{"level":"warn","ts":"2026-06-04T12:02:30Z","msg":"Rate limit hit","user_id":1003,"ip":"192.168.1.12","method":"POST","path":"/api/v1/send","status":429}
EOF

页面:

这组测试数据包含:

  • info;
  • error;
  • warn;
  • user_id;
  • IP;
  • method;
  • path;
  • status。

比单纯一行字符串更接近日常Web服务日志。

32 给Promtail增加JSON解析

编辑Promtail配置,内容保持如下:

shell 复制代码
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: test
    static_configs:
      - targets:
          - localhost
        labels:
          job: test
          __path__: /var/log/test.log

  - job_name: app-json
    pipeline_stages:
      - json:
          expressions:
            level: level
            msg: msg

    static_configs:
      - targets:
          - localhost
        labels:
          job: app
          __path__: /var/log/app.json

页面:

这里通过:

pipeline_stages

增加JSON解析。

配置中先提取:

  • level
  • msg

原始JSON日志行仍然保留。

后面在Grafana查询里还会继续使用 | json 做字段解析。

33 重启Promtail加载配置

执行:

shell 复制代码
docker-compose restart promtail

配置重新加载以后,就可以开始做更细的LogQL查询。

34 查询error级别日志

在Grafana Explore中使用:

shell 复制代码
{job="app"} | json | level = "error"

结果:

这个查询逻辑是:

先选job=app,再解析JSON,再筛选level=error。

35 查询HTTP状态码

继续执行:

shell 复制代码
{job="app"} | json | status >= 500

结果:

这样可以直接筛:

status >= 500

的日志。

36 用LogQL做时间窗口统计

执行:

shell 复制代码
sum by (path) (
  count_over_time({job="app"}[5m])
)

结果:

这类查询更适合看:

  • 一段时间内日志数量;
  • 某服务错误趋势;
  • 不同job的变化。

如果后续再结合Grafana面板,就可以把日志查询继续做成图表。

37 再模拟Nginx和Auth日志

写入:

shell 复制代码
# 模拟 nginx 日志
echo '192.168.1.10 - - [04/Jun/2026:12:10:00 +0000] "GET /api/v1/data HTTP/1.1" 200 1024' >> /var/log/nginx-access.log

# 模拟 auth 服务日志
echo "$(date -Iseconds) [AUTH] User 1001 logged in from 192.168.1.10" >> /var/log/auth.log

页面:

现在测试日志源已经包括:

  • test;
  • app-json;
  • nginx;
  • auth。

38 Promtail增加多日志源

配置保持如下:

shell 复制代码
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: test
    static_configs:
      - targets: [localhost]
        labels:
          job: test
          __path__: /var/log/test.log

  - job_name: app-json
    pipeline_stages:
      - json:
          expressions:
            level: level
            msg: msg
    static_configs:                     # ← 必须在这里!
      - targets: [localhost]
        labels:
          job: app
          __path__: /var/log/app.json

  - job_name: nginx
    static_configs:
      - targets: [localhost]
        labels:
          job: nginx
          __path__: /var/log/nginx-access.log

  - job_name: auth
    static_configs:
      - targets: [localhost]
        labels:
          job: auth
          __path__: /var/log/auth.log

页面:

这一步把不同文件分别挂到不同job:

  • test
  • app
  • nginx
  • auth

这样后续在Grafana里可以直接按job切换日志流。

39 多日志源真正解决的是什么

页面:

当应用越来越多以后,真正需要的不是把所有日志混在一起。

而是通过标签先缩小范围。

例如:

  • 先查auth登录;
  • 再查同时间段nginx访问;
  • 再看app错误。

这也是Loki使用标签组织日志时更适合的排障方式。

40 本地PLG链到这里已经完整跑通

现在已经完成:

日志文件

↓

Promtail

↓

Loki

↓

Grafana

并且进一步验证了:

  • 普通文本日志;
  • JSON日志;
  • LogQL过滤;
  • 状态码筛选;
  • 时间窗口统计;
  • 多job日志源。

如果只在局域网里使用,做到这里已经足够。

41 远程访问为什么只开放Grafana

真正给人看的入口是Grafana。

Promtail和Loki更多属于后端采集与存储组件。

所以远程访问时,这篇只给:

3000

增加外部Web入口。

这样结构更清楚:

外部浏览器 → Grafana → Loki → 日志

而不是把所有后端端口都同时暴露出去。

42 安装cpolar

执行:

shell 复制代码
sudo curl https://get.cpolar.sh | sh

结果:

安装完成以后检查服务:

shell 复制代码
sudo systemctl status cpolar

结果:

确认正常以后,再进入Web管理页面。

43 打开cpolar管理界面

浏览器访问:

服务器IP:9200

页面:

登录以后,后面的Grafana公网入口在这里配置。

44 给Grafana的3000创建HTTP隧道

创建参数:

  • 隧道名称:grafana
  • 协议:HTTP
  • 本地地址:3000
  • 域名类型:随机域名
  • 地区:China Top

页面:

这里映射的是:

Grafana Web端口3000。

45 先用随机公网地址验证

进入在线隧道列表:

从其他网络打开生成的地址:

如果Grafana页面能够正常打开,可以确认:

外部浏览器 → 公网地址 → Grafana:3000

已经跑通。

46 随机地址适合先测试

随机地址更适合验证:

网络链路到底通不通。

如果准备长期远程看日志,再继续配置固定二级子域名。

47 保留Grafana固定二级子域名

进入预留页面:

这次示例名称:

grafana3

页面:

实际使用时,以自己账号最终成功保留的名称为准。

48 编辑Grafana隧道

回到隧道列表:

把域名类型改成二级子域名,并填写已经保留的名称:

49 查看固定地址

进入在线隧道列表:

可以看到原来的随机地址已经切换成固定二级子域名。

50 最后从外部设备再访问一次

使用固定地址打开Grafana:

能够正常进入以后,长期远程入口完成。

整条链现在变成:

外部浏览器 → 固定公网地址 → Grafana:3000 → Loki → 日志数据

51 远程访问时不要忽略Grafana权限

日志平台里可能包含:

  • 服务报错;
  • 用户ID;
  • IP地址;
  • 请求路径;
  • 认证日志;
  • 内部主机信息。

所以公网访问时至少要同时检查:

  • 默认管理员密码是否已经修改;
  • 是否仍启用匿名访问;
  • 匿名用户权限是否过高;
  • 公网地址是否无范围传播;
  • Grafana用户权限是否合理。

尤其这份Docker Compose测试配置里开启了匿名Admin。

如果用于长期远程环境,这一项比"固定域名好不好记"更值得先处理。

52 手动部署和Docker一体化该怎么选

这篇同时保留了两条路线。

手动部署

优点是每个组件的配置、启动脚本、目录都能单独看清楚。

更适合理解:

  • Loki怎么启动;
  • Promtail怎么推日志;
  • Grafana怎么独立运行。

Docker Compose

优点是三个组件可以在一个网络里一起管理。

更适合:

  • 快速搭建;
  • 统一启动停止;
  • 把配置文件集中保存。

两条路线不需要在同一台机器上重复跑两套。

根据自己的维护方式选一种即可。

53 这套PLG日志系统真正适合什么人

比较适合:

  • 有多台服务器或多个服务;
  • 日志已经分散到多个目录;
  • 经常需要按时间和服务排错;
  • 希望用浏览器集中查日志;
  • 想用LogQL做过滤和统计;
  • 更倾向轻量化日志平台。

如果只有一个小应用,直接看本地日志文件可能已经够用。

日志系统真正开始体现价值,通常是在服务数量和排障频率都上来以后。

54 最后把完整技术链重新看一遍

采集:

日志文件 → Promtail

存储:

Promtail → Loki

查询:

Loki → Grafana

普通日志验证:

test.log → Promtail → Loki API → Grafana

结构化日志:

app.json → JSON解析 → LogQL

多日志源:

test / app / nginx / auth

Docker路线:

Promtail + Loki + Grafana → Docker Compose

远程:

外部浏览器 → 固定公网地址 → Grafana:3000

实际完成:

  • CentOS环境准备;
  • Loki下载与配置;
  • Loki启动脚本;
  • Grafana安装;
  • Grafana登录;
  • Promtail配置;
  • Promtail启动;
  • Docker Compose一体化部署;
  • Loki数据源;
  • test.log验证;
  • JSON日志;
  • LogQL过滤;
  • 状态码查询;
  • 时间窗口统计;
  • Nginx日志;
  • Auth日志;
  • 多job采集;
  • cpolar安装;
  • Grafana随机公网访问;
  • 固定二级子域名;
  • 外部浏览器访问。

这样PLG才真正从"三个组件都装上了",变成一条可以持续采集、集中查询、结构化分析并支持远程查看的日志链。

总结

这次真正跑通的是一条完整的PLG日志链:Promtail负责盯住日志文件并推送,Loki负责存储日志流,Grafana负责查询和展示。文章同时保留了手动部署和Docker Compose两条路线,方便分别理解组件关系和一体化运行方式。

验证部分没有停在"服务启动成功",而是继续写入test.log,通过Loki API确认日志已经进入,再到Grafana Explore里执行LogQL查询。后面又加入JSON日志、错误级别、状态码、多日志源和时间窗口统计,把真实排障里常用的几层逐步补齐。

远程部分只开放Grafana的3000 Web入口,没有把Loki和Promtail后端端口一起公开。随机地址先验证网络链路,固定二级子域名再解决长期入口变化的问题。

真正需要长期注意的是权限。尤其Docker配置中保留了匿名Admin设置,如果Grafana准备长期从公网访问,应优先重新检查认证、匿名权限和管理员账号,而不是只关注公网地址是否固定。日志平台本身往往包含大量内部信息,公网可达和安全可用必须分开处理。

相关推荐
云水初1 小时前
【项目篇】基于LanGraph的自动处理客服邮件的 Agent汇总
开发语言·笔记·python·学习·fastapi·langgraph
djjjx.1 小时前
Linux进程篇(四):内核托底与生死交错 ,深度硬核剖析“僵尸”与“孤儿”进程
linux·运维·服务器
为思念酝酿的痛2 小时前
Reactor反应堆模式
linux·服务器·网络
沫璃染墨2 小时前
从零入门计算机网络系列(六):TCP套接字编程实战——从listen监听到客户端与服务器通信
linux·服务器·c++·tcp/ip·计算机网络·tcp
香吧香2 小时前
venv 详解
python
笨笨饿2 小时前
#142_VS Code.map文件插件的用法
git·python·stm32·单片机·嵌入式硬件·物联网·vim
zwd20052 小时前
Manim 竖屏 1080×1920 配置详解:pixel_width、frame_width 怎么写(0.21.0 / 0.22.0 实测)
python·manim·数学动画·短视频制作·manim教程·竖屏视频
2401_872418782 小时前
把 Ubuntu 服务器变成 AI Agent 终端:用自然语言或语音管理 Linux,任何命令都先审批(附完整 Python 源码)
linux·服务器·ubuntu·agent