Loki 日志系統


loki 日志系統

elk,功能很多,資源也要求高,對於我們中小團隊來說比較重,但是使用查看開發環境日志不太簡易。loki 比較簡單使用。具體更多介紹可以參考官方網站:https://github.com/grafana/loki

loki 日志系統組成

  • loki是主服務器,負責存儲日志和處理查詢。
  • promtail是代理,負責收集日志並將其發送給 loki 。
  • Grafana用於 UI 展示。

環境說明和前提准備

我這邊的業務都是docker swarm 集群運行的。本次日志系統主要是提供一個可瀏覽的頁面給開發測試及時查看日志。
對日志的配置有以下幾點要求:

  • 統一在代碼中配置日志輸出的路徑、歸檔格式
    在容器中展示的格式為:/項目名稱/logs/項目名稱/ 下有 按照日期的歸檔文件、debug.log、error.log

代碼中關於logback-spring.xml的配置,可以參考:

<?xml version="1.0" encoding="UTF-8"?>
<!--
    小技巧: 在根pom里面設置統一存放路徑,統一管理方便維護
    <properties>
        <log-path>/Users/vonedao</log-path>
    </properties>
    1. 其他模塊加日志輸出,直接copy本文件放在resources 目錄即可
    2. 注意修改 <property name="${log-path}/log.path" value=""/> 的value模塊
-->
<configuration debug="false" scan="false">
	<property name="log.path" value="logs/${project.artifactId}"/>
	<property name="log.service.name" value="${project.artifactId}"/>
	<!-- 彩色日志格式 -->
	<property name="CONSOLE_LOG_PATTERN"
			  value="${CONSOLE_LOG_PATTERN:-%clr([%d{yyyy-MM-dd HH:mm:ss.SSS}]){faint} %clr([${log.service.name}]) %clr([${LOG_LEVEL_PATTERN:-%5p}]) %clr([${PID:- }]	){magenta} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%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"/>
	<!-- Console log output -->
	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
		</encoder>
	</appender>

	<!-- Log file debug output -->
	<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${log.path}/debug.log</file>
		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
			<fileNamePattern>${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
			<maxFileSize>50MB</maxFileSize>
			<maxHistory>30</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
		</encoder>
	</appender>

	<!-- Log file error output -->
	<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${log.path}/error.log</file>
		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
			<fileNamePattern>${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
			<maxFileSize>50MB</maxFileSize>
			<maxHistory>30</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
		</encoder>
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>ERROR</level>
		</filter>
	</appender>

	<logger name="org.activiti.engine.impl.db" level="DEBUG">
		<appender-ref ref="debug"/>
	</logger>

	<!--nacos 心跳 INFO 屏蔽-->
	<logger name="com.alibaba.nacos" level="OFF">
		<appender-ref ref="error"/>
	</logger>
	<!-- Level: FATAL 0  ERROR 3  WARN 4  INFO 6  DEBUG 7 -->
	<root level="INFO">
		<appender-ref ref="console"/>
		<appender-ref ref="debug"/>
	</root>
</configuration>

代碼打包成鏡像的時候,注意添加項目的WORKDIR,參考:

FROM java:8-jre

MAINTAINER zoujiaojiao@gmail.com

ENV TZ=Asia/Shanghai

RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN mkdir -p /項目名稱

WORKDIR /項目名稱

EXPOSE 10018

ADD ./target/項目名稱.jar ./

CMD sleep 10;java -Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom -jar 項目名稱.jar

  • 使用nfs存儲日志
Nfs服務端:10.10.3.71 
目錄:/home/vonedaologs
客戶端掛載:
Ubuntu系統安裝客戶端:
#apt-get install nfs-common
centos系統安裝客戶端:
#yum install nfs-utils -y
#mkdir /vonedaologs
#mount -t nfs 10.10.3.71:/home/vonedaologs /vonedaologs
#vi /etc/fstab 
10.10.3.71:/home/vonedaologs  /vonedaologs nfs     defaults        0       0

  • 業務容器Yaml編排增加日志掛載路徑
version: '3.0'
services:
  vonedao-tenant-business-job-biz:
    image: docker.vonedao.com/vonedao-cs/vonedao-tenant-business-job-biz:1.0.0-SNAPSHOT
    logging:
      driver: json-file
      options:
        max-size: "1M"
        max-file: "5"
    volumes:
      - /vonedaologs/dev:/vonedao-tenant-business-job-biz/logs
#測試環境使用
#      - /vonedaologs/sit:/vonedao-tenant-business-job-biz/logs
……
……

啟動業務容器后,查看日志情況:

所有業務日志都收集到共享nfs目錄了。

loki日志系統搭建

Grafana

version: "3"

networks:
  loki:
    external: true

services:
  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    networks:
      - loki

啟動命令: docker stack deploy -c grafana.yaml grafana
瀏覽器訪問,賬戶admin,密碼admin:

Loki

loki我分為開發、測試、生產
開發:loki_dev.yaml

version: "3"

networks:
  loki:
    external: true

services:
  loki_dev:
    image: grafana/loki:latest
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    networks:
      - loki

啟動命令:docker stack deploy -c loki_dev.yaml loki_dev

在grafana上添加開發環境的loki:



Promtail

Promtail 開發環境的配置dev_promtail_config.yml ,使用開發環境的loki地址,填寫開發環境的日志路徑:

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

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

scrape_configs:
- job_name: dev_vonedao-tenant-finance
  static_configs:
  - targets:
      - localhost
    labels:
      job: vonedao-tenant-finance
      __path__: /vonedaologs/dev/vonedao-tenant-finance-biz/*
- job_name: dev_vonedao-auth
  static_configs:
  - targets:
      - localhost
    labels:
      job: vonedao-auth
      __path__: /vonedaologs/dev/vonedao-auth/*
……
……

Promtail啟動容器的yaml編排文件:
Promtail_dev.yaml

version: "3"

networks:
  loki:
    external: true
services:
  promtail:
    image: grafana/promtail:latest
    volumes:
      - /vonedaologs:/vonedaologs
  #    - /var/log:/var/log 暫時不收系統日志
      - /vonedaologs/promtail/dev_promtail_config.yml:/etc/promtail/config.yml
    command: -config.file=/etc/promtail/config.yml
    deploy:
      mode: replicated
      replicas: 1
      restart_policy:
        condition: on-failure
    networks:
      - loki

啟動: docker stack deploy -c promtail_dev.yaml promtail_dev

日志系統使用

可以配置多個loki:

選擇配置好的開發環境loki,通過labels找自己需要的工程日志:

可以限制行數,可以進行5秒刷新設置:

查看日志:

可以寫搜索表達式來過濾想要的日志。

包含"INFO"
{job="vonedao-auth"} |= "INFO"

排除掉info日志:

{job="vonedao-auth"} != "INFO"


匹配正則表達式:

|~

不匹配正則表達式:

!~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM