Plumelog 入门指南

474

前言

Plumelog : 一个简单易用的java分布式日志组件

博主编写文章时 Plumelog 最新版为 3.5.2,以下所有介绍皆围绕该版本编写,不排除以后版本升级带来的不兼容问题。

这里介绍的只是博主使用过的方法,并不代表所有使用方式,想解锁更多使用姿势请跳转原文

博主服务版本

  • springBoot : 2.3.11.RELEASE
  • springCloud : Hoxton.SR3
  • springCloudAlibaba : 2.2.4.RELEASE
  • plumelog : 3.5.2redis 模式
  • redis : 5,单节点
  • elasticsearch : 7.10.0

系统介绍

  • 无代码入侵的分布式日志系统,基于 log4jlog4j2 logback 搜集日志,设置链路ID,方便查询关联日志。
  • 基于 elasticsearch 作为查询引擎。
  • 高吞吐,查询效率高。
  • 全程不占应用程序本地磁盘空间,免维护;对于项目透明,不影响项目本身运行。
  • 无需修改老项目,引入直接使用,支持 dubbo ,支持 springcloud

架构

image

  • plumelog-core : 核心组件包含日志搜集端,负责搜集日志并推送到 kafkaredis 等队列。
  • plumelog-server : 负责把队列中的日志日志异步写入到 elasticsearch
  • plumelog-demo : 基于 springboot 的使用案例。
  • plumelog-lite : plumelog 的嵌入式集成版本,免部署。

plumelog 服务端安装

注意事项

  • plumelog 分三种启动模式,分别为 redis , kafka , lite ,外加嵌入式版本plumelog-lite
  • lite 模式,不依赖任何外部中间件直接启动使用,但是性能有限,一天10个G以内可以应付,还必须是SSD硬盘,适合管理系统类的小玩家
  • redis , kafka 模式,可以集群分布式部署,适合大型玩家,互联网公司
  • plumelog-lite模式,plumelog 的嵌入式集成版本,直接 pom 引用,嵌入在项目中,自带查询界面,适合单个独立小项目使用,外包软件的最佳伴侣

如果使用 redis 作为队列传输日志,建议单开 redis 专门用来做传输作用,不要与业务 redis 混合使用,以免对生成环境造成影响。

安装流程

这里只介绍 docker 方式安装的方法,elasticsearch 请自行安装。

  1. /data(可自定义) 目录下建立 plumelog 目录。
mkdir /data/plumelog
cd /data/plumelog
  1. 新建一个 application.properties 文件

plumelog 基于 java 环境运行,这里需要先指定配置文件。

这里的配置并包含所有类型,如有需要全量配置,请点击源文件地址

执行指令:

vim /data/plumelog/application.properties

填入以下信息:

注意将 es 地址与 redis 地址更换为自己的服务器地址。

# 基础配置
spring.application.name=plumelog_server
server.port=8891
spring.thymeleaf.mode=LEGACYHTML5
spring.mvc.view.prefix=classpath:/templates/
spring.mvc.view.suffix=.html
spring.mvc.static-path-pattern=/plumelog/**
spring.boot.admin.context-path=admin

# 使用模式
plumelog.model=redis

#队列redis地址
plumelog.queue.redis.redisHost=192.168.0.2:6101
plumelog.queue.redis.redisPassWord=redispass
plumelog.queue.redis.redisDb=0

#配置管理redis地址
plumelog.redis.redisHost=192.168.0.2:6101
plumelog.redis.redisPassWord=redispass

#elasticsearch相关配置,host多个用逗号隔开
plumelog.es.esHosts=192.168.0.8:7201
plumelog.es.userName=elastic
plumelog.es.passWord=elasticpass

#单日日志体量在50G以内,并使用的SSD硬盘
plumelog.es.shards=5
plumelog.es.replicas=0
plumelog.es.refresh.interval=30s
plumelog.es.indexType.model=day
plumelog.es.indexType.zoneId=GMT+8

#单次拉取日志条数
plumelog.maxSendSize=100

#拉取时间间隔,kafka不生效
plumelog.interval=200

#plumelog-ui的地址 如果不配置,报警信息里不可以点连接
plumelog.ui.url=http://log.yourhost.com

#管理密码,手动删除日志的时候需要输入的密码
admin.password=adminpass

#日志保留天数,配置0或者不配置默认永久保留
admin.log.keepDays=30
admin.log.trace.keepDays=30

#登录用户名密码,为空没有登录界面
login.username=admin
login.password=adminpass
  1. 新建一个 redis.conf 文件

执行指令:

vim /data/plumelog/redis.conf

填入以下信息:

# 关闭保护模式
protected-mode no

#内存耗尽时采用的淘汰策略:
maxmemory-policy volatile-ttl

# 开启 appendonly 备份模式
appendonly yes

# 每秒钟备份
appendfsync everysec

#保存数据的AOF文件名称
appendfilename "appendonly.aof"

# 对aof文件进行压缩时,是否执行同步操作
no-appendfsync-on-rewrite no

# 当目前aof文件大小超过上一次重写时的aof文件大小的100%时会再次进行重写
auto-aof-rewrite-percentage 100

# 重写前AOF文件的大小最小值 默认 64mb
auto-aof-rewrite-min-size 512mb

# 关闭快照备份

# Generated by CONFIG REWRITE
dir "/data"
masterauth "redispass"
requirepass "redispass"
  1. 新建一个 docker-compose.yml 文件

在需要安装 plumelog 的目录下执行指令 : vim docker-compose.yml

填入以下信息:

version: '3.7'
services:
  plumelog:
    image: xiaobai021sdo/plumelog:3.5
    container_name: plumelog
    volumes:
      - ./application.properties:/plumelog-server/config/application.properties
    ports:
      - 8891:8891
    restart: always
    depends_on:
      - redis
  redis:
    image: redis:5
    container_name: log-redis
    ports:
      - 8892:6379
    restart: always
    volumes:
      - ./redis.conf:/usr/local/redis/redis.conf
    command:
      redis-server /usr/local/redis/redis.conf
  1. 启动服务

执行以下指令:

docker-compose up -d
  1. 访问服务

进入 http://127.0.0.1:8891 ,进入后显示如下页面则安装完毕。

image

使用方法

注意事项

  • 推荐使用 logback ,特别是 springbootspringcloud 项目。注意:3.2版本 logbackbug,请使用 3.2.1 修复版本或者以上版本
  • 示例中 plumelog 相关版本号为示例,实际使用建议取最新的版本,点击获取最新的版本号

小提示:为什么 Spring Boot 推荐使用 logback-spring.xml 来替代 logback.xml 来配置 logback 日志的问题分析。
logback.xml 加载早于 application.properties ,所以如果你在 logback.xml 使用了变量时,而恰好这个变量是写在 application.properties时,那么就会获取不到,只要改成 logback-spring.xml 就可以解决。
这就是为什么有些人用了 nacos 等配置中心,不能加载远程配置的原因,是因为加载优先级的问题。

客户端配置

  • maven 引入:
<dependency>
    <groupId>com.plumelog</groupId>
    <artifactId>plumelog-logback</artifactId>
    <version>3.5.2</version>
</dependency>
  • application.yml 中添加如下配置

地址更改为自己部署服务的地址

plumelog.appName=plumelog_demo
plumelog.redisHost=127.0.0.1:8892
plumelog.redisAuth=redispass
spring.profiles.active=dev
  • logback-spring.xml 配置

配置详解:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <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"/>
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <!--输出到控制台-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--过滤trace日志到控制台-->
        <filter class="com.plumelog.logback.util.FilterSyncLogger">
            <level></level>
        </filter>
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>
  <!-- 输出到文件 -->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <FileNamePattern>logs/plumelog-demo.log.%d{yyyy-MM-dd}.log</FileNamePattern>
        <MaxHistory>3</MaxHistory>
      </rollingPolicy>
      <encoder>
        <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
        <!-- 设置字符集 -->
        <charset>UTF-8</charset>
      </encoder>
    </appender>
  <!-- 环境配置 -->
    <springProperty scope="context" name="plumelog.appName" source="plumelog.appName"/>
    <springProperty scope="context" name="plumelog.redisHost" source="plumelog.redisHost"/>
    <springProperty scope="context" name="plumelog.redisPort" source="plumelog.redisPort"/>
    <springProperty scope="context" name="plumelog.redisAuth" source="plumelog.redisAuth"/>
    <springProperty scope="context" name="plumelog.redisDb" source="plumelog.redisDb"/>
    <springProperty scope="context" name="plumelog.env" source="spring.profiles.active"/>
   <!-- 输出plumelog -->
    <appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
        <appName>${plumelog.appName}</appName>
        <redisHost>${plumelog.redisHost}</redisHost>
        <redisAuth>${plumelog.redisAuth}</redisAuth>
        <redisDb>${plumelog.redisDb}</redisDb>
        <env>${plumelog.env}</env>
    </appender>
    <!-- 配置日志输出,只输出info,只保留控制台和plumelog输出-->
  <!-- 正常开发环境本地,只输出到控制台,测试环境只输出到plumelog,生产环境输出到本地文件plumelog,因为有plumelog加持本地文件就保留3天即可-->
  <!-- 这些都可以根据环境配置不同加载不同的ref->
    <root level="info">
      <!--输出到控制台-->
        <appender-ref ref="CONSOLE"/>
      <!-- 输出到文件 -->
        <appender-ref ref="file"/>
      <!-- 输出plumelog -->
        <appender-ref ref="plumelog"/>
    </root>
  
</configuration>

配置释义:

字段值 用途
appName 自定义应用名称
redisHost redis地址,哨兵模式多个用逗号隔开
redisAuth redis密码
redisDb redis db 如果要切换db,redis必须要配置密码
model sentinel 哨兵模式,standalone 单机模式
masterName 哨兵模式需要配置哨兵的masterName
runModel 1表示最高性能模式,2表示低性能模式 但是2可以获取更多信息 不配置默认为1
maxCount (3.1)批量提交日志数量,默认100
logQueueSize (3.1.2)缓冲队列数量大小,默认10000,太小可能丢日志,太大容易内存溢出,根据实际情况,如果项目内存足够可以设置到100000+
compressor (3.4)是否开启日志压缩,默认false
env (3.5)环境 默认是default
  • 结合环境配置案例
    <springProfile name="dev">
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
        </root>
    </springProfile>
    <springProfile name="test">
        <root level="INFO">
            <appender-ref ref="FILE" />
        </root>
    </springProfile>
    <springProfile name="prod">
    <root level="INFO">
      <appender-ref ref="FILE" />
    </root>
    </springProfile>

配置到这里,启动服务即可推送日志到 plumelog-server 平台,enjoy~

后记

博主这里只做抛砖引玉的介绍,plumelog 还支持很多中不同的使用模式,需要更深入了解 plumelog 的读者,请参考地址 : 点我去原文