简介
官方简介:Loki 是一个受 Prometheus 启发的水平可扩展、高度可用的多租户日志聚合系统。它的设计非常具有成本效益且易于操作。它不索引日志的内容,而是为每个日志流编制一组标签。。
背景
日志统一管理问题。
教程
前置准备
# 1、拉取安装脚本
git clone https://gitee.com/clancy-lv/plg-install-script.git
# 2、进入脚本文件所在目录
cd plg-install-script
# 3、给install脚本添加可执行权限
chmod +x install.sh
一、安装Loki
1、脚本安装Loki
# 1、取消install.sh脚本末尾中loki_install "$1" "$2"注释
# 2、执行命令(第一个参数:loki压缩包全名称;第二个参数:压缩包解压后绝对路径)
sh install.sh 'loki-linux-amd64.zip' '/usr/local/loki/data'
2、开放3100端口供Promtail推送日志
3、Loki启动相关命令
Loki服务启动命令:
systemctl start loki.service
Loki服务停止命令:
systemctl stop loki.service
Loki服务状态命令:
systemctl status loki.service
Loki服务重启命令:
systemctl restart loki.service
二、日志推送
(一)、java方式推送
1、pom依赖
<!--Loki 日志收集-->
<dependency>
<groupId>com.github.loki4j</groupId>
<artifactId>loki-logback-appender-jdk8</artifactId>
<version>1.5.1</version>
</dependency>
<!--Loki 日志发送http请求和响应工具-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
2、yml文件配置
# Loki 日志
loki:
# Loki服务地址,需要将日志推送到的地址 默认端口:3100(需要确保安装Loki的服务器放行此端口)
url: http://ip:3100/loki/api/v1/push
# 标签,用于日志筛选;可根据自己需要添加或修改
label:
# 环境
env: 开发
# 工作名称,默认为项目名称
job-name: @artifactId@
# 主机名称,不要填localhost,不然无法区分
host-ip: 192.168.1.190
3、logback-spring.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 彩色控制台控制 -->
<substitutionProperty name="log.pattern" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) ${PID:-} %clr(---){faint} %clr(%-80.80logger{79}){cyan} %clr(:){faint} %m%n%wEx"/>
<substitutionProperty name="log.pattern.no" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) ${PID:-} %clr(---){faint} %clr(%-80.80logger{79}){cyan} %clr(:){faint} %m%n%wEx"/>
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<springProperty scope="context" name="LOG_FILE_DIR" source="logback.log-file-dir"
defaultValue = "log"/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern}</pattern>
</encoder>
<!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} -%5p ${PID:-} [%15.15t] %-40.40logger{39} : %m%n</pattern>-->
</appender>
<!-- 对应yml中属性,可自行添加或修改 -->
<springProperty scope="context" name="url" source="loki.url"/>
<springProperty scope="context" name="env" source="loki.label.env"/>
<springProperty scope="context" name="jobName" source="loki.label.job-name"/>
<springProperty scope="context" name="hostIp" source="loki.label.host-ip"/>
<appender name="LOKI" class="com.github.loki4j.logback.Loki4jAppender">
<http class="com.github.loki4j.logback.ApacheHttpSender">
<url>${url}</url>
</http>
<format>
<label>
<pattern>env=${env},jobName=${jobName},hostIp=${hostIp},logLevel=%level</pattern>
</label>
<message>
<pattern>${log.pattern.no}</pattern>
</message>
<sortByTime>true</sortByTime>
</format>
</appender>
<!-- 使用异步方式将日志推送至Loki -->
<appender name="ASYNC_LOKI" class="ch.qos.logback.classic.AsyncAppender">
<!-- 队列大小设置,根据实际需要调整 -->
<queueSize>512</queueSize>
<!-- 丢弃策略,当队列满时采取的操作 -->
<discardingThreshold>0</discardingThreshold>
<neverBlock>true</neverBlock>
<!-- 实际的Loki Appender -->
<appender-ref ref="LOKI" />
</appender>
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern.no}</pattern>
<!--<pattern>%msg%n</pattern>-->
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>${LOG_FILE_DIR}\info.%d.log</fileNamePattern>
<!--保留30天日志-->
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern.no}</pattern>
<!--<pattern>%msg%n</pattern>-->
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>${LOG_FILE_DIR}\error.%d.log</fileNamePattern>
<!--保留30天日志-->
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="fileInfoLog" />
<appender-ref ref="fileErrorLog" />
<appender-ref ref="ASYNC_LOKI" />
</root>
</configuration>
(二)、Promtail方式推送
1、修改promtail-local-config.yaml配置
# prometail.yaml 配置文件
# 配置 Promtail 服务端
server:
# HTTP 服务监听的端口(0表示随机)
http_listen_port: 9080
# gRPC 服务监听的端口(0表示随机)
grpc_listen_port: 0
# 描述了如何将读取的文件偏移量保存到磁盘上
positions:
# positions 文件的路径
filename: ./positions.yaml
# 描述 Promtail 如何连接到 Loki 的多个实例,向每个实例发送日志。
clients:
# Loki 正在监听的 URL
- url: http://localhost:3100/loki/api/v1/push
# 抓取日志配置
scrape_configs:
# 用于在 Promtail 中识别该抓取配置的名称。
- job_name: test
# 抓取日志静态目标配置
static_configs:
- targets:
- localhost
labels:
# 环境:开发、测试、生产
env: 开发
job: test
host: localhost
# 要加载日志的路径
__path__: xxx/logs/*.log
2、脚本安装Promtail
# 1、取消install.sh中promtail_install "$1" "$2"注释
# 2、执行命令(第一个参数:promtail压缩包全名称;第二个参数:压缩包解压后绝对路径)
sh install.sh 'promtail-linux-amd64.zip' '/usr/local/promtail/data'
3、Promtail启动相关命令
Promtail服务启动命令:
systemctl start promtail.service
Promtail服务停止命令:
systemctl stop promtail.service
Promtail服务状态命令:
systemctl status promtail.service
Promtail服务重启命令:
systemctl restart promtail.service
三、安装Grafana
1、Grafana安装
yum install -y https://dl.grafana.com/enterprise/release/grafana-enterprise-10.4.2-1.x86_64.rpm
2、开放3000端口供用户访问页面
3、Grafana启动相关命令
Grafana服务启动命令:
systemctl start grafana-server.service
Grafana服务停止命令:
systemctl stop grafana-server.service
Grafana服务状态命令:
systemctl status grafana-server.service
Grafana服务重启命令:
systemctl restart grafana-server.service
4、Grafana页面访问
路径:http://ip:3000
用户名:(默认:admin)
密码:(默认:admin)