Plumelog 入门指南
前言
Plumelog
: 一个简单易用的java分布式日志组件
博主编写文章时 Plumelog
最新版为 3.5.2
,以下所有介绍皆围绕该版本编写,不排除以后版本升级带来的不兼容问题。
这里介绍的只是博主使用过的方法,并不代表所有使用方式,想解锁更多使用姿势请跳转原文。
博主服务版本
springBoot
:2.3.11.RELEASE
springCloud
:Hoxton.SR3
springCloudAlibaba
:2.2.4.RELEASE
plumelog
:3.5.2
,redis
模式redis
:5
,单节点elasticsearch
:7.10.0
系统介绍
- 无代码入侵的分布式日志系统,基于
log4j
、log4j2
、logback
搜集日志,设置链路ID,方便查询关联日志。 - 基于
elasticsearch
作为查询引擎。 - 高吞吐,查询效率高。
- 全程不占应用程序本地磁盘空间,免维护;对于项目透明,不影响项目本身运行。
- 无需修改老项目,引入直接使用,支持
dubbo
,支持springcloud
。
架构
plumelog-core
: 核心组件包含日志搜集端,负责搜集日志并推送到kafka
,redis
等队列。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
请自行安装。
- 在
/data
(可自定义) 目录下建立plumelog
目录。
mkdir /data/plumelog
cd /data/plumelog
- 新建一个
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
- 新建一个
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"
- 新建一个
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
- 启动服务
执行以下指令:
docker-compose up -d
- 访问服务
进入 http://127.0.0.1:8891
,进入后显示如下页面则安装完毕。
使用方法
注意事项
- 推荐使用
logback
,特别是springboot
,springcloud
项目。注意:3.2
版本logback
有bug
,请使用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
的读者,请参考地址 : 点我去原文