社交媒體 網(wǎng)站網(wǎng)址seo關鍵詞
文章目錄
- 前言
- 一、日志組件介紹
-
- 1.1 Loki組件
- 1.2 Loki4j組件
- 1.3 Grafana
- 二、組件下載安裝運行
-
- Loki下載安裝運行
- Grafana下載安裝運行
- 三、創(chuàng)建springboot項目
- 總結
前言
日志在任何一個web應用中都是不可忽視的存在,它已經(jīng)成為大部分系統(tǒng)的標準組成部分。搭建日志可視化的主要目的是為了更好地理解和管理應用程序產(chǎn)生的大量日志數(shù)據(jù)。日志數(shù)據(jù)對于了解系統(tǒng)的運行狀態(tài)、診斷問題以及優(yōu)化性能至關重要。筆者之前有一篇文章有介紹搭建ELK日志可視化系統(tǒng),但是這個日志系統(tǒng)太重太麻煩,安裝的東西很多,本文介紹一款新的輕量級日志系統(tǒng),基本組成部分為這幾個組件——springboot+Loki+Loki4j+Grafana,下面筆者分別介紹Loki、Loki4j、Grafana這幾個組件,然后創(chuàng)建一個簡單的springboot項目,來演示如何集成使用這幾個組件搭建一個輕量級的日志系統(tǒng)。
本文源碼倉庫地址:Gitee
本文涉及到的組件資源已全部上傳,請于文章頂部下載
一、日志組件介紹
1.1 Loki組件
Loki 是一個開源的日志聚合系統(tǒng),由 Grafana Labs 開發(fā)和維護。Loki 的設計目標是提供一種高效、可擴展的方式來收集、索引和查詢結構化日志數(shù)據(jù)
。Loki 專注于日志數(shù)據(jù),與傳統(tǒng)的日志管理系統(tǒng)(如 ELK Stack)相比,它采用了不同的方法來處理日志數(shù)據(jù)。
Loki 的特點
-
標簽查詢:
- Loki 使用類似于 Prometheus 的標簽查詢模型,允許用戶通過標簽來過濾和聚合日志數(shù)據(jù)。
- 這種模型非常適合大規(guī)模的日志數(shù)據(jù)查詢和分析。
-
無索引日志存儲:
- Loki 不對原始日志數(shù)據(jù)進行全文索引,而是將日志數(shù)據(jù)按流存儲,并使用標簽來標識每個流。
- 這種方法降低了存儲成本,并提高了查詢性能。
-
水平可擴展性:
- Loki 能夠水平擴展,通過增加更多的節(jié)點來處理更多的日志數(shù)據(jù)。
- 這使得 Loki 非常適合處理大規(guī)模的日志數(shù)據(jù)集。
-
高可用性:
- Loki 支持高可用性部署,可以配置多個實例來確保數(shù)據(jù)的持久性和服務的連續(xù)性。
-
多租戶支持:
- Loki 支持多租戶部署,不同的組織或團隊可以在同一套基礎設施上獨立管理自己的日志數(shù)據(jù)。
-
與 Grafana 集成:
- Loki 與 Grafana 緊密集成,可以直接在 Grafana 中查詢和可視化 Loki 中的日志數(shù)據(jù)。
- 這使得 Loki 成為了 Grafana 生態(tài)系統(tǒng)的一個重要組成部分。
- 低資源消耗:
- 相比于 ELK Stack,Loki 對資源的需求較低,更適合中小規(guī)模的團隊使用。
Loki 的架構
Loki 的架構主要包括以下幾個組件:
-
Loki Server
:- 主服務器,負責接收日志數(shù)據(jù)、存儲數(shù)據(jù)和處理查詢。
-
Promtail
:- 一個輕量級的日志代理,用于收集日志文件并將日志數(shù)據(jù)發(fā)送給 Loki。
-
Grafana
:- 用于查詢和顯示 Loki 中的日志數(shù)據(jù)的界面。
-
Storage
:- Loki 使用對象存儲(如 S3 或 GCS)來持久化日志數(shù)據(jù),以降低存儲成本。
使用場景
Loki 特別適用于以下場景:
大規(guī)模日志收集
:適用于需要處理大量日志數(shù)據(jù)的環(huán)境。實時日志查詢
:需要快速查詢和分析日志數(shù)據(jù)的場景。低成本日志存儲
:希望降低日志存儲成本的項目。
總之,Loki 是一個現(xiàn)代的日志管理系統(tǒng),它簡化了日志數(shù)據(jù)的收集、存儲和查詢過程,特別適合那些需要高性能、可擴展性和成本效益的日志管理解決方案。
1.2 Loki4j組件
Loki4j 是一個基于 Java 的日志框架
,它提供了一種簡單的方式來將日志數(shù)據(jù)發(fā)送到 Loki。Loki4j 旨在與 Loki 日志聚合系統(tǒng)無縫集成,使得 Java 應用程序能夠輕松地將日志數(shù)據(jù)發(fā)送到 Loki 以進行集中管理和分析。
Loki4j 的特點
-
易于集成:
- Loki4j 提供了一個簡單的 API,可以很容易地與現(xiàn)有的 Java 應用程序集成。
- 支持 SLF4J 和 Logback 等流行的 Java 日志框架。
-
標簽支持:
- Loki4j 支持 Loki 的標簽查詢模型,允許用戶在日志消息中添加標簽,以便更好地組織和查詢?nèi)罩緮?shù)據(jù)。
-
異步日志記錄:
- Loki4j 支持異步日志記錄,可以提高應用程序的性能,因為它不會阻塞應用程序線程。
-
配置靈活:
- Loki4j 提供了靈活的配置選項,可以根據(jù)需要定制日志級別、日志格式等。
-
錯誤處理:
- Loki4j 包含了錯誤處理機制,可以處理網(wǎng)絡問題或其他異常情況,確保日志數(shù)據(jù)能夠可靠地發(fā)送到 Loki。
1.3 Grafana
Grafana 是一款開源的數(shù)據(jù)可視化和分析平臺,主要用于可視化時間和序列數(shù)據(jù),如監(jiān)控指標、日志文件、應用程序跟蹤等
。它支持多種數(shù)據(jù)源,包括Prometheus、InfluxDB、MySQL、PostgreSQL、Elasticsearch、CloudWatch、Graphite等,以及自定義數(shù)據(jù)源。Grafana被廣泛應用于IT基礎架構監(jiān)控、應用性能監(jiān)控(APM)、物聯(lián)網(wǎng)(IoT)數(shù)據(jù)分析、業(yè)務指標監(jiān)控等多個領域。
主要特點
-
直觀的界面:Grafana提供了一個用戶友好的界面,用于創(chuàng)建和編輯儀表盤,使得數(shù)據(jù)可視化變得非常簡單,無需編程知識。
-
豐富的圖表類型:支持多種圖表類型,如折線圖、柱狀圖、餅圖、熱力圖、儀表盤、表格等,適合不同類型的視覺展示需求。
-
動態(tài)和交互式面板:面板可以配置為具有時間選擇器、下拉菜單、查詢編輯器等交互元素,使用戶能更靈活地探索數(shù)據(jù)。
-
報警功能:Grafana支持基于規(guī)則的報警系統(tǒng),當數(shù)據(jù)達到預設的閾值時,可以通過電子郵件、Slack、PagerDuty等多種方式發(fā)送通知。
注釋和事件:用戶可以在圖表上添加注釋,記錄特定時間點發(fā)生的重要事件,有助于理解數(shù)據(jù)波動的原因。 -
模板變量:通過使用模板變量,可以創(chuàng)建動態(tài)儀表盤,允許用戶在不修改儀表盤的情況下,快速切換查看不同數(shù)據(jù)源或視角。
-
插件生態(tài):Grafana擁有強大的社區(qū)支持,提供了大量的數(shù)據(jù)源插件、面板插件和應用插件,大大擴展了其功能和適用場景。
-
API和腳本支持:Grafana提供了完善的API接口,允許用戶通過腳本和外部應用自動化創(chuàng)建和管理儀表盤、數(shù)據(jù)源和用戶權限。
-
團隊協(xié)作和權限管理:支持多用戶訪問,可以為不同用戶或團隊分配不同的權限,促進團隊間的協(xié)作。
應用場景
-
IT運維監(jiān)控
:實時監(jiān)控服務器性能、網(wǎng)絡流量、應用程序健康狀況等。 -
業(yè)務分析
:展現(xiàn)用戶行為、銷售數(shù)據(jù)、營銷活動效果等業(yè)務指標。 -
物聯(lián)網(wǎng)數(shù)據(jù)可視化
:分析設備傳感器數(shù)據(jù),監(jiān)控物聯(lián)網(wǎng)系統(tǒng)運行狀態(tài)。 -
日志分析
:結合Loki等日志管理系統(tǒng),進行日志數(shù)據(jù)的實時查詢和可視化展示。
Grafana憑借其靈活性和易用性,成為了數(shù)據(jù)分析和監(jiān)控領域的首選工具之一,幫助企業(yè)更好地理解數(shù)據(jù)、發(fā)現(xiàn)問題和制定決策。
二、組件下載安裝運行
筆者是在windows系統(tǒng)下演示,所用的組件都是windows系統(tǒng)下的,linux系統(tǒng)中安裝配置自行網(wǎng)上搜索教程即可。
Loki下載安裝運行
下載地址:Loki下載地址
把下載的loki-windows-amd64.exe.zip壓縮包解壓,得到loki-windows-amd64.exe文件,進入這個文件中可以看到有一個可執(zhí)行的程序(不用去點,點了也會閃退),創(chuàng)建一個config文件夾
再進入config文件夾中,創(chuàng)建loki-config.yaml配置文件,文件內(nèi)容如下:
server:# Loki 服務監(jiān)聽的 HTTP 端口號http_listen_port: 3100schema_config:configs:- from: 2024-07-01# 使用 BoltDB 作為索引存儲store: boltdb# 使用文件系統(tǒng)作為對象存儲object_store: filesystem# 使用 v11 版本的 schemaschema: v11index:# 索引前綴prefix: index_# 索引周期為 24 小時period: 24hingester:lifecycler:# 設置本地 IP 地址address: 127.0.0.1ring:kvstore:# 使用內(nèi)存作為 kvstorestore: inmemory# 復制因子設置為 1replication_factor: 1# 生命周期結束后的休眠時間final_sleep: 0s# chunk 的空閑期為 5 分鐘chunk_idle_period: 5m# chunk 的保留期為 30 秒chunk_retain_period: 30sstorage_config:boltdb:# BoltDB 的存儲路徑directory: D:softwareloki-windows-amd64.exeBoltDBfilesystem:# 文件系統(tǒng)的存儲路徑directory: D:softwareloki-windows-amd64.exeileStorelimits_config:# 不強制執(zhí)行指標名稱enforce_metric_name: false# 拒絕舊樣本reject_old_samples: true# 最大拒絕舊樣本的年齡為 168 小時reject_old_samples_max_age: 168h# 每個用戶每秒的采樣率限制為 32 MBingestion_rate_mb: 32# 每個用戶允許的采樣突發(fā)大小為 64 MBingestion_burst_size_mb: 64chunk_store_config:# 最大可查詢歷史日期為 28 天(672 小時),這個時間必須是 schema_config 中 period 的倍數(shù),否則會報錯max_look_back_period: 672htable_manager:# 啟用表的保留期刪除功能retention_deletes_enabled: true# 表的保留期為 28 天(672 小時)retention_period: 672h
注意yaml文件中的 BoltDB 的存儲路徑和 文件系統(tǒng)的存儲路徑
,這個自行替換為自己的路徑
yaml文件內(nèi)容保存好后,使用cmd進入 loki-windows-amd64.exe可執(zhí)行程序所在目錄下,執(zhí)行下面的啟動命令(這個啟動命令是以后啟動Loki組件的專用命令,指定了配置文件
)
loki-windows-amd64.exe --config.file=config/loki-config.yaml
執(zhí)行結果如下
下面的這幾個文件夾都是根據(jù)配置自動生成的
注意:yaml配置文件配置的Loki監(jiān)聽端口號如下,這個記好,后面集成時需要使用
# Loki 服務監(jiān)聽的 HTTP 端口號http_listen_port: 3100
Grafana下載安裝運行
下載地址:Grafana下載
把下載后的壓縮文件夾grafana-enterprise-11.1.0.windows-amd64.zip解壓得到grafana-v11.1.0文件,進入bin目錄找到grafana-server.exe程序雙擊運行
會自動彈出一個cmd窗口,打印出花花綠綠的日志信息,很好看
程序運行成功后訪問:http://localhost:3000,初始賬戶: admin/admin 登錄后需重置密碼,筆者沒有改變密碼,還是使用原來的,下面是登錄進去后的操作
添加Loki數(shù)據(jù)源
選擇添加數(shù)據(jù)源后,出現(xiàn)了很多數(shù)據(jù)源,找到Loki點擊即可
設置名稱和監(jiān)聽的數(shù)據(jù)源地址
之前安裝Loki配置文件里設置的:http://localhost:3100
設置Header和Value
Header:X-Scope-OrgID
Value:user1
save & test
注意:如果save&test報錯可能是Loki服務初始化還未完成,驗證Loki初始化是否完成訪問:http://localhost:3100/ready,如果顯示ready即初始化完成
三、創(chuàng)建springboot項目
添加pom依賴
<!--Loki 日志收集--><dependency><groupId>com.github.loki4j</groupId><artifactId>loki-logback-appender</artifactId><version>1.5.1</version></dependency><!--Loki 日志發(fā)送http請求和響應工具--><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency>
在Resources文件夾下創(chuàng)建**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></appender><springProperty scope="context" name="url" source="loki.url" defaultValue="http://localhost:3100/loki/api/v1/push"/><springProperty scope="context" name="env" source="loki.label.env" defaultValue="dev"/><springProperty scope="context" name="jobName" source="loki.label.job-name" defaultValue="my-app"/><springProperty scope="context" name="hostIp" source="loki.label.host-ip" defaultValue="localhost"/><springProperty scope="context" name="orgId" source="loki.org-id" defaultValue="default-org"/><appender name="LOKI" class="com.github.loki4j.logback.Loki4jAppender"><http class="com.github.loki4j.logback.ApacheHttpSender"><url>${url}</url><tenantId>${orgId}</tenantId></http><format><label><pattern>application=${jobName},env=${env},host=${hostIp},level=%level</pattern></label><message><pattern>{"timestamp": "%d{yyyy-MM-dd HH:mm:ss.SSS}", "level": "%level", "logger": "%logger{36}", "thread": "%thread", "message": "%msg%n"}</pattern></message><sortByTime>true</sortByTime></format></appender><!-- 使用異步方式將日志推送至Loki --><appender name="ASYNC_LOKI" class="ch.qos.logback.classic.AsyncAppender"><!-- 隊列大小設置,根據(jù)實際需要調(diào)整 --><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></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></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>
application.yml配置文件內(nèi)容如下:
spring:application:name: Grafana-Project# Loki 日志配置
loki:# Loki 服務的 URL,用于推送日志數(shù)據(jù)url: http://localhost:3100/loki/api/v1/push# 標簽配置,用于標識日志來源的額外信息label:# 環(huán)境標簽,標識當前運行的環(huán)境,例如開發(fā)環(huán)境env: dev# 服務名稱標簽,標識日志來源的服務名稱job-name: my-service# 主機 IP 標簽,標識日志來源的主機 IP 地址host-ip: localhost# 組織 ID,用于多租戶環(huán)境中標識日志所屬的組織org-id: user1
啟動類加上如下日志
啟動后去Grafana查詢?nèi)罩拘畔?/p>
由上圖可以看到日志已經(jīng)發(fā)送到Grafana了,但是只有l(wèi)og方式記錄的才會,控制臺輸出的不會記錄
注意:剛啟動組件時,后臺需要一定時間加載,這時候是無法記錄日志的。
總結
本篇文章詳細介紹了使用springboot+Loki+Loki4j+Grafana搭建輕量級日志系統(tǒng)的步驟,整體環(huán)境為windows環(huán)境,Linux環(huán)境下的組件安裝配置也類似。