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"
匹配正則表達式:
|~
不匹配正則表達式:
!~