# 使用Grafana Loki可视化查询应用数据日志
#### 应用场景
Grafana Loki是一种日志聚合系统，旨在为应用程序提供高效、可扩展且成本效益高的日志记录。与传统的日志管理工具不同，Loki专注于索引元数据而非完整的日志内容，从而显著降低了资源使用和复杂性。它与Grafana无缝集成，实现强大的日志可视化和查询功能，使其成为已经使用Prometheus进行指标监控的应用程序的天然选择。传统的日志管理系统由于需要对日志数据进行全文索引，通常需要高资源消耗、复杂的基础设施和昂贵的存储。随着应用程序的扩展，这些系统可能会变得成本高昂且效率低下，使得日志管理和查询变得困难。Grafana Loki通过仅索引日志的元数据（标签）而非整个内容，大幅降低了资源使用，简化了日志管理，并使得与Prometheus和Grafana等现有可观测性工具的集成更加容易，从而实现统一的监控和故障排除。
在本教程中，我们将实现以下目标：
- 了解Grafana Loki日志工具的工作原理。
- 配置Loki以收集各种应用程序日志，并将日志数据推送到Grafana Loki，以便在华为云进一步的分析和查询日志。
 
#### 前提条件
1. 弹性云服务器已绑定弹性公网IP。
2. 弹性云服务器所在安全组添加了如[表1]所示的安全组规则，具体步骤参见[为安全组添加安全组规则](https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_0030969470.html)。
    表1安全组规则 
   | 方向   | 优先级 | 策略 | 类型    | 协议端口      | 源地址        |
   |:---|:---|:---|:---|:---|:---|
   | 入方向   | 1       | 允许   | IPv4   | TCP: 3001 | 0.0.0.0/0 |
   | 入方向  | 1       | 允许   | IPv4 | TCP: 3100   | 0.0.0.0/0     |
   | 入方向 | 1    | 允许  | IPv4 | TCP: 9093  | 0.0.0.0/0   |
      
   
 
#### 资源与成本规划
表2资源和成本规划 
| 资源     | 资源说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | 成本说明                                                                                                                                                                                                                                                                                                                                                                                   |
|:---|:---|:---|
| 虚拟私有云VPC | VPC网段：192.168.0.0/16                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | 免费                                                                                                                                                                                                                                                                                                                                                                                   |
| 虚拟私有云子网  | - 可用区：可用区1  - 子网网段：192.168.0.0/24                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | 免费                                                                                                                                                                                                                                                                                                                                                                                   |
| 安全组          | 入方向规则： - 优先级：1  - 策略：允许  - 类型：IPv4  - 协议端口：ICMP: 全部  - 源地址：0.0.0.0/0                                                                                                                                                                                                                                                                                                                                                                                                                                               | 免费                                                                                                                                                                                                                                                                                                                                                                                      |
| 弹性云服务器    | - 名称：ecs-prometheus  - 计费模式：包年/包月  - 可用区：可用区1  - 规格：c7n.xlarge.4  - 镜像：Ubuntu 22.04 server 64bit  - 系统盘：40G  - 弹性公网IP：现在购买  - 线路：全动态BGP  - 公网带宽：按流量计费  - 带宽大小：5 Mbit/s                         | ECS涉及以下几项费用： - 云服务器  - 云硬盘  - 弹性公网IP   具体的计费方式及标准请参考[计费模式概述](https://support.huaweicloud.com/price-ecs/ecs_billing_2001.html)。 |
| 弹性云服务器    | - 名称：ecs-target-0001  - 计费模式：包年/包月  - 可用区：可用区1  - 规格：s7n.xlarge.2  - 镜像：Ubuntu 22.04 server 64bit  - 系统盘：40G  - 弹性公网IP：现在购买  - 线路：全动态BGP  - 公网带宽：按流量计费  - 带宽大小：5 Mbit/s   | ECS涉及以下几项费用： - 云服务器  - 云硬盘  - 弹性公网IP   具体的计费方式及标准请参考[计费模式概述](https://support.huaweicloud.com/price-ecs/ecs_billing_2001.html)。 |
| 弹性云服务器    | - 名称：ecs-target-0002  - 计费模式：包年/包月  - 可用区：可用区1  - 规格：s7n.xlarge.2  - 镜像：Ubuntu 22.04 server 64bit  - 系统盘：40G  - 弹性公网IP：现在购买  - 线路：全动态BGP  - 公网带宽：按流量计费  - 带宽大小：5 Mbit/s                       | ECS涉及以下几项费用： - 云服务器  - 云硬盘  - 弹性公网IP   具体的计费方式及标准请参考[计费模式概述](https://support.huaweicloud.com/price-ecs/ecs_billing_2001.html)。 |
   
#### 操作流程
使用Grafana Loki可视化查询应用数据日志的操作流程如下：
1. [安装并配置Grafana Loki]
2. [在目标节点上安装Promtail代理]
3. [在目标节点上创建一个简单的Node.js应用程序]
4. [配置Nginx日志收集任务]
5. [结果验证]
 
 #### 安装并配置Grafana Loki
1. 远程登录ecs-prometheus。
2. 执行以下命令，更新仓库。
   ```
   sudo apt update
   ```
   
3. 执行以下命令，安装Grafana。
   ```
   wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
   sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
   sudo apt update
   sudo apt install grafana
   ```
   
4. 执行以下命令，启用Grafana服务。
   ```
   sudo systemctl start grafana-server
   sudo systemctl enable grafana-server
   ```
   
5. 执行以下命令，安装Grafana Loki。
   ```
   curl -s https://api.github.com/repos/grafana/loki/releases/latest | grep browser_download_url |  cut -d '"' -f 4 | grep loki-linux-amd64.zip | wget -i -
   sudo apt install unzip
   unzip loki-linux-amd64.zip
   sudo mv loki-linux-amd64 /usr/local/bin/loki
   ```
   
6. 执行以下命令，验证Grafana Loki的安装版本。
   ```
   loki --version
   ```
   回显如下类似信息：
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002533812903.png "点击放大")
   
7. 执行以下命令，创建Grafana Loki配置文件。
   ```
   sudo mkdir -p /data/loki
   sudo wget -O /etc/loki-local-config.yaml https://raw.githubusercontent.com/grafana/loki/v3.1.1/cmd/loki/loki-local-config.yaml
   ```
   
8. 执行以下命令，修改Grafana Loki配置文件。
   ```
   sudo vim /etc/loki-local-config.yaml
   ```
   配置文件内容如下：
   ```
   auth_enabled: false
   server:
     http_listen_port: 3100
     grpc_listen_port: 9096
   common:
     instance_addr: 127.0.0.1
     path_prefix: /tmp/loki
     storage:
       filesystem:
         chunks_directory: /tmp/loki/chunks
         rules_directory: /tmp/loki/rules
     replication_factor: 1
     ring:
       kvstore:
         store: inmemory
   query_range:
     results_cache:
       cache:
         embedded_cache:
           enabled: true
           max_size_mb: 100
   schema_config:
     configs:
       - from: 2020-10-24
         store: tsdb
         object_store: filesystem
         schema: v13
         index:
           prefix: index_
           period: 24h
   ruler:
     alertmanager_url: http://localhost:9093    //此处的localhost替换为ecs-target-0001的弹性公网IP
   ```
   
9. 执行以下命令，创建Loki服务。
   ```
   sudo vim /etc/systemd/system/loki.service
   ```
   
10. 在loki.service文件中添加以下内容：
    ```
    [Unit]
    Description=Loki service
    After=network.target
    [Service]
    Type=simple
    User=root
    ExecStart=/usr/local/bin/loki -config.file /etc/loki-local-config.yaml
    [Install]
    WantedBy=multi-user.target
    ```
    
11. 按**Esc** 键退出编辑模式，并输入**:wq**保存后退出。
12. 重新加载Systemd配置，以使新的服务文件生效。
    ```
    sudo systemctl daemon-reload
    ```
    
13. 启动Loki服务并设置为开机自启动。
    ```
    sudo systemctl start loki.service
    sudo systemctl enable loki.service
    ```
    
14. 检查Loki服务状态，确保它正在运行。
    ```
    sudo systemctl status loki.service
    ```
    回显如下类似信息。
    ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002533657155.png "点击放大")
    
 
 #### 在目标节点上安装Promtail代理
1. 远程登录弹性云服务器ecs-target-0001。
2. 执行以下命令，更新仓库。
   ```
   sudo apt update
   ```
   
3. 执行以下命令，下载二进制文件
   ```
   curl -s https://api.github.com/repos/grafana/loki/releases/latest | grep browser_download_url |  cut -d '"' -f 4 | grep promtail-linux-amd64.zip | wget -i -
   ```
   
4. 执行以下命令，安装Promtail代理。
   ```
   sudo apt install unzip
   unzip promtail-linux-amd64.zip
   sudo mv promtail-linux-amd64 /usr/local/bin/promtail
   ```
   
5. 执行以下命令，验证Promtail安装版本。
   ```
   promtail --version
   ```
   回显如下类似信息：
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002533659495.png "点击放大")
   
6. 执行以下命令，配置Promtail。
   ```
   cd /etc
   wget https://raw.githubusercontent.com/grafana/loki/v3.1.1/clients/cmd/promtail/promtail-local-config.yaml
   sudo vim promtail-local-config.yaml
   ```
   配置文件内容如下：
   ```
   server:
     http_listen_port: 9080
     grpc_listen_port: 0
   positions:
     filename: /data/loki/positions.yaml
   clients:
     - url: http://localhost:3100/loki/api/v1/push   //此处的localhost替换为ecs-prometheus的弹性公网IP
   scrape_configs:
   - job_name: system
     static_configs:
     - targets:
         - localhost
       labels:
         job: varlogs
         __path__: /var/log/*log
   ```
   
7. 按**Esc** 键退出编辑模式，并输入**:wq**保存后退出。
8. 执行以下命令，打开Promtail服务文件。
   ```
   sudo vim /etc/systemd/system/promtail.service
   ```
   
9. 在promtail.service文件中添加以下内容：
   ```
   [Unit]
   Description=Promtail service
   After=network.target
   [Service]
   Type=simple
   User=root
   ExecStart=/usr/local/bin/promtail -config.file /etc/promtail-local-config.yaml
   [Install]
   WantedBy=multi-user.target
   ```
   
10. 按**Esc** 键退出编辑模式，并输入**:wq**保存后退出。
11. 重新加载Systemd配置，以使更改生效。
    ```
    sudo systemctl daemon-reload
    ```
    
12. 启动Promtail服务并设置为开机自启动。
    ```
    sudo systemctl start promtail.service
    sudo systemctl enable promtail.service
    ```
    
13. 检查Promtail服务状态，确保它正在运行。
    ```
    sudo systemctl status promtail.service
    ```
    回显如下类似信息。
    ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002501900216.png "点击放大")
    
 
 #### 在目标节点上创建一个简单的Node.js应用程序
1. 远程登录弹性云服务器ecs-target-0002。
2. 执行以下命令，安装Node.js。
   ```
   sudo apt update
   sudo apt install nodejs npm -y
   ```
   
3. 执行以下命令，编辑Node.js文件。
   ```
   sudo mkdir app
   sudo vim app/app.js
   ```
   配置文件内容如下：
   ```
   const http = require('http');
   const fs = require('fs');
   let requestCounter = 0;
   const server = http.createServer((req, res) => {
       requestCounter++;
       const logMessage = `Request #${requestCounter} received at ${new Date()}\n`;
       fs.appendFile('/var/log/nodejsapp/app.log', logMessage, (err) => {
           if (err) {
               console.error('Error writing to log file:', err);
           }
       });
       res.statusCode = 200;
       res.setHeader('Content-Type', 'text/plain');
       res.end(`Hello, World!\nTotal requests: ${requestCounter}`);
   });
   server.listen(3001, () => {
       console.log('Server running at http://localhost:3001/');
   });
   ```
   
4. 按**Esc** 键退出编辑模式，并输入**:wq**保存后退出。
5. 执行以下命令，创建日志目录。
   ```
   sudo mkdir -p /var/log/nodejsapp
   sudo touch /var/log/nodejsapp/app.log
   sudo chmod 777 /var/log/nodejsapp/app.log
   ```
   
6. 执行以下命令，在后台运行app.js应用程序。
   ```
   sudo node app/app.js &
   ```
   回显如下类似信息。
   ```
   Server running at http://localhost:3001/
   ```
   
7. 使用浏览器访问"http://*服务器IP地址* *:3001* "，访问应用程序。
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002535418887.png "点击放大")
   
 
 #### 配置Nginx日志收集任务
1. 远程登录弹性云服务器ecs-target-0001。
2. 导航到已安装Promtail的目标节点。
   ```
   sudo apt install nginx
   sudo systemctl status nginx
   ```
   
3. 执行以下命令，配置Promtail日志收集任务。
   ```
   sudo vim /etc/promtail-local-config.yaml
   ```
   配置文件内容如下：
   ```
   server:
     http_listen_port: 9080
     grpc_listen_port: 0
   positions:
     filename: /tmp/positions.yaml
   clients:
     - url: http://localhost:3100/loki/api/v1/push   //此处的localhost替换为ecs-prometheus的弹性公网IP
   scrape_configs:
     - job_name: system
       static_configs:
         - targets:
             - localhost
           labels:
             job: varlogs
             __path__: /var/log/*log
   ```
   
4. 执行以下命令，重启Promtail服务。
   ```
   systemctl restart promtail.service
   systemctl status promtail.service
   ```
   
 
 #### 结果验证
1. 确保Grafana Loki服务在服务器上处于活动和运行状态。
   图1Grafana Loki 服务   
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002535540693.png "点击放大") 
2. 确保Promtail服务在目标节点上处于活动和运行状态。
   图2Promtail服务   
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002535540771.png "点击放大") 
3. 确保应用程序正在运行，并多次刷新网页以确保请求次数增加。
   图3在浏览器中访问应用程序1   
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002503700868.png "点击放大")
   图4在浏览器中访问应用程序2   
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002503541192.png "点击放大") 
4. 在Grafana Loki中添加一个新的数据源连接。
   图5在Grafana Loki中配置新的数据源连接   
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002502033698.png "点击放大") 
5. 验证应用程序日志是否已推送至Grafana Loki。
   1. 在Grafana仪表板中单击"Explore"。
   
   2. 设置标签过滤器，单击"Execute"按钮执行日志查询。 此时能够看到日志存储在Grafana Loki中，并且接收到的请求次数表示从互联网访问应用程序的次数。
      图6在Grafana Loki中查看应用程序数据日志   
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002533794423.png "点击放大")
      图7日志详情   
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002533634571.png "点击放大") 
    
 
#### 结论
在本指南中，我们学习了如何在服务器上安装和配置Loki以收集华为云环境中目标服务器的应用程序日志。我们还学习了如何将日志数据推送到Grafana Loki，并利用 Grafana的内置功能在浏览器中可视化和查询应用程序日志。
