elk,功能很多,资源也要求高,对于我们中小团队来说比较重,但是使用查看开发环境日志不太简易。loki 比较简单使用。具体更多介绍可以参考官方网站:https://github.com/grafana/loki

loki 日志系统组成

  • loki是主服务器,负责存储日志和处理查询。
  • promtail是代理,负责收集日志并将其发送给 loki 。
  • Grafana用于 UI 展示。

环境说明和前提准备

我这边的业务都是docker swarm 集群运行的。本次日志系统主要是提供一个可浏览的页面给开发测试及时查看日志。
对日志的配置有以下几点要求:

  • 统一在代码中配置日志输出的路径、归档格式
    在容器中展示的格式为:/项目名称/logs/项目名称/ 下有 按照日期的归档文件、debug.log、error.log

Loki 日志系统

代码中关于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
……
……

启动业务容器后,查看日志情况:
Loki 日志系统

所有业务日志都收集到共享nfs目录了。

loki日志系统搭建

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我分为开发、测试、生产
开发: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:
Loki 日志系统
Loki 日志系统
Loki 日志系统
Loki 日志系统

Promtail

Promtail 开发环境的配置dev_promtail_config.yml ,使用开发环境的loki地址,填写开发环境的日志路径:
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 日志系统
选择配置好的开发环境loki,通过labels找自己需要的工程日志:
Loki 日志系统
可以限制行数,可以进行5秒刷新设置:
Loki 日志系统

查看日志:
Loki 日志系统
可以写搜索表达式来过滤想要的日志。

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

Loki 日志系统

排除掉info日志:

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

Loki 日志系统
Loki 日志系统

匹配正则表达式:

|~

不匹配正则表达式:

!~

分类:

技术点:

相关文章: