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