背景:当我们的线上服务出了问题时,我们最先想到的是查看服务器日志。但是,传统的项目的日志一般都写在服务器的log文件中,非常不方便查阅。为了更好的查看线上的日志,我之前搭建了elk集群日志,虽然可以用kibana的discover查看,但是查看的日志特别乱,无法快速定位到哪个请求。于是,使用plumelog来代替elk日志,plumelog也是将日志写入到elasticsearch中,但是整体的页面更好看,方便查询。
plumelog官网,使用流程按官方的文档配置即可。这里我列下我的整合文件,基于配置中心的logback日志。
plumelog-server:
1.pom.xml:
-
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <groupId>com.plumeloggroupId>
- <artifactId>plumelogartifactId>
- <version>3.5version>
- parent>
- <modelVersion>4.0.0modelVersion>
- <artifactId>plumelog-serverartifactId>
- <name>plumelog-servername>
- <properties>
- <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
- <redis.version>3.1.0redis.version>
- <kafka.version>2.5.0kafka.version>
- <springboot.version>2.6.3springboot.version>
- <elasticsearch.version>7.7.0elasticsearch.version>
- <spring-cloud.version>2021.0.1spring-cloud.version>
- <spring-cloud-alibaba.version>2021.0.1.0spring-cloud-alibaba.version>
- properties>
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-dependenciesartifactId>
- <version>2.6.3version>
- <type>pomtype>
- <scope>importscope>
- dependency>
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-dependenciesartifactId>
- <version>${spring-cloud.version}version>
- <type>pomtype>
- <scope>importscope>
- dependency>
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-alibaba-dependenciesartifactId>
- <version>${spring-cloud-alibaba.version}version>
- <type>pomtype>
- <scope>importscope>
- dependency>
- dependencies>
- dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
- dependency>
-
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
- dependency>
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-starter-bootstrapartifactId>
- dependency>
- <dependency>
- <groupId>com.taobao.topgroupId>
- <artifactId>lippi-oapi-encrptartifactId>
- <version>dingtalk-SNAPSHOTversion>
- <scope>systemscope>
- <systemPath>${project.basedir}/lib/taobao-sdk-java-auto_1479188381469-20200701.jarsystemPath>
- dependency>
- <dependency>
- <groupId>org.elasticsearch.clientgroupId>
- <artifactId>elasticsearch-rest-clientartifactId>
- <version>7.7.0version>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- <exclusions>
- <exclusion>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-tomcatartifactId>
- exclusion>
- exclusions>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-jettyartifactId>
- dependency>
- <dependency>
- <groupId>net.sourceforge.nekohtmlgroupId>
- <artifactId>nekohtmlartifactId>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-thymeleafartifactId>
- dependency>
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>fastjsonartifactId>
- <version>1.2.62version>
- dependency>
- <dependency>
- <groupId>junitgroupId>
- <artifactId>junitartifactId>
- <version>4.11version>
- <scope>testscope>
- dependency>
- <dependency>
- <groupId>com.plumeloggroupId>
- <artifactId>plumelog-logbackartifactId>
- <version>${version}version>
- dependency>
- <dependency>
- <groupId>org.apache.lucenegroupId>
- <artifactId>lucene-queryparserartifactId>
- <version>7.7.3version>
- dependency>
- <dependency>
- <groupId>org.apache.lucenegroupId>
- <artifactId>lucene-highlighterartifactId>
- <version>7.7.3version>
- dependency>
- <dependency>
- <groupId>org.apache.lucenegroupId>
- <artifactId>lucene-groupingartifactId>
- <version>7.7.3version>
- dependency>
- <dependency>
- <groupId>org.apache.commonsgroupId>
- <artifactId>commons-ioartifactId>
- <version>1.3.2version>
- dependency>
- <dependency>
- <groupId>org.apache.lucenegroupId>
- <artifactId>lucene-analyzers-smartcnartifactId>
- <version>7.7.3version>
- dependency>
- <dependency>
- <groupId>de.codecentricgroupId>
- <artifactId>spring-boot-admin-starter-serverartifactId>
- <exclusions>
- <exclusion>
- <groupId>io.projectreactor.nettygroupId>
- <artifactId>reactor-nettyartifactId>
- exclusion>
- exclusions>
- <version>2.6.3version>
- dependency>
-
- <dependency>
- <groupId>io.projectreactor.nettygroupId>
- <artifactId>reactor-nettyartifactId>
- <version>0.9.10.RELEASEversion>
- dependency>
-
- <dependency>
- <groupId>com.plumeloggroupId>
- <artifactId>plumelog-luceneartifactId>
- <version>3.5version>
- <scope>compilescope>
- dependency>
- dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.pluginsgroupId>
- <artifactId>maven-surefire-pluginartifactId>
- <version>2.18.1version>
- <configuration>
- <skipTests>trueskipTests>
- configuration>
- plugin>
- <plugin>
- <groupId>org.apache.maven.pluginsgroupId>
- <artifactId>maven-deploy-pluginartifactId>
- <version>2.8.2version>
- <configuration>
- <skip>trueskip>
- configuration>
- plugin>
- <plugin>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-maven-pluginartifactId>
- <version>2.6.3version>
- <configuration>
- <fork>truefork>
- <jvmArguments>-Dfile.encoding=UTF-8jvmArguments>
- <includeSystemScope>trueincludeSystemScope>
- configuration>
- <executions>
- <execution>
- <goals>
- <goal>repackagegoal>
- goals>
- execution>
- executions>
- plugin>
-
- <plugin>
- <groupId>org.apache.maven.pluginsgroupId>
- <artifactId>maven-resources-pluginartifactId>
- <version>2.7version>
- <executions>
- <execution>
- <id>copy-configid>
- <phase>packagephase>
- <goals>
- <goal>copy-resourcesgoal>
- goals>
- <configuration>
- <outputDirectory>${project.build.directory}/outputDirectory>
- <resources>
- <resource>
- <directory>src/main/resourcesdirectory>
- <includes>
- <exclude>**/*.xmlexclude>
- <exclude>**/*.confexclude>
- <exclude>**/*.propertiesexclude>
- <exclude>**/*.shexclude>
- <exclude>**/*.batexclude>
- includes>
- <filtering>truefiltering>
- resource>
- resources>
- <encoding>UTF-8encoding>
- configuration>
- execution>
- executions>
- plugin>
- <plugin>
- <groupId>org.apache.maven.pluginsgroupId>
- <artifactId>maven-jar-pluginartifactId>
- <version>2.4version>
- <configuration>
- <finalName>plumelog-serverfinalName>
- <excludes>
- <exclude>*.propertiesexclude>
- excludes>
- configuration>
- plugin>
- plugins>
- build>
- project>
2.bootstrap.yaml:
- admin:
- log:
- keepDays: 30
- trace:
- keepDays: 30
- #管理密码,手动删除日志的时候需要输入的密码
- password: 123456
- #登录配置,配置后会有登录界面
- login:
- password: admin
- username: admin
- plumelog:
- #elasticsearch相关配置,Hosts支持携带协议,如:http、https,集群逗号隔开,lite模式可以全部注释掉下面配置
- es:
- esHosts: https://192.168.0.28:29200
- indexType:
- model: day
- refresh:
- interval: 30s
- replicas: 1
- shards: 5
- #是否信任自签证书
- trustSelfSigned: true
- userName: elastic
- passWord: elastic
- #是否hostname验证
- #hostnameVerification: false
- #拉取时间间隔,kafka不生效
- interval: 100
- #单次拉取日志条数
- maxSendSize: 500
- model: redis
- queue:
- redis:
- redisDb: 0
- redisHost: 192.168.0.143:30360
- redisPassWord: wanfu!@#
- ui:
- url: http://demo.plumelog.com
- server:
- port: 8892
- spring:
- application:
- name: plumelog-server
- boot:
- admin:
- context-path: admin
- mvc:
- static-path-pattern: /plumelog/**
- view:
- prefix: classpath:/templates/
- suffix: .html
- profiles:
- active: fat
- thymeleaf:
- mode: LEGACYHTML5
- cloud:
- nacos:
- server-addr: ${NACOS_ADDRESS:192.168.0.143:8848}
- username: ${NACOS_USERNAME:nacos}
- password: ${NACOS_PASSWORD:wanfu!@#}
- config:
- namespace: ${spring.profiles.active}
- group: WF_GROUP
- file-extension: yaml
- discovery:
- namespace: ${spring.profiles.active}
- group: WF_GROUP
logback-spring.xml:
- <configuration debug="false">
-
- <property name="LOG_HOME" value="/log" />
-
-
-
- <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">
- <encoder>
- <Pattern>${CONSOLE_LOG_PATTERN}Pattern>
-
- <charset>UTF-8charset>
- encoder>
- appender>
-
- <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <filter class="com.plumelog.logback.util.FilterSyncLogger">
- <level>infolevel>
- <filterPackage>com.plumelog.trace.aspect.AbstractAspectfilterPackage>
- filter>
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <FileNamePattern>logs/plumelog-server.log.%d{yyyy-MM-dd}.logFileNamePattern>
- <MaxHistory>3MaxHistory>
- rollingPolicy>
- <encoder>
- <Pattern>${CONSOLE_LOG_PATTERN}Pattern>
-
- <charset>UTF-8charset>
- encoder>
- appender>
-
- <springProfile name="dev">
- <root level="INFO">
- <appender-ref ref="CONSOLE" />
- <appender-ref ref="FILE" />
- root>
- springProfile>
- <springProfile name="fat">
- <root level="INFO">
- <appender-ref ref="CONSOLE" />
- <appender-ref ref="FILE" />
- root>
- springProfile>
- <springProfile name="pro">
- <root level="INFO">
- <appender-ref ref="CONSOLE" />
- <appender-ref ref="FILE" />
- root>
- springProfile>
-
- configuration>
4.使用docker-compose部署plumelog-server
4.1 dockerfile:
- FROM openjdk:11.0.12-jre-buster
- ADD application.jar /application.jar
- ADD bootstrap.yaml /bootstrap.yaml
- ADD logback-spring.xml /logback-spring.xml
- CMD ["java", "-jar", "-Dfile.encoding=UTF-8", "/application.jar"]
4.2 docker-compose.yaml:
- version: "3"
- services:
- plume-server-fat:
- image: fat/com.wf/plume-service
- container_name: fat-plume-server
- ports:
- - 28891:8891
- restart: always

构建镜像:docker build -t fat/com.wf/plume-service .
启动服务 docker-compose up -d
访问ui界面:http://192.168.0.28:28891

配置客户端:
5.1.添加相关jar包:
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-aopartifactId>
- <version>2.6.3version>
- dependency>
-
- <dependency>
- <groupId>de.codecentricgroupId>
- <artifactId>spring-boot-admin-starter-clientartifactId>
- <version>2.6.3version>
- dependency>
- <dependency>
- <groupId>com.plumeloggroupId>
- <artifactId>plumelog-logbackartifactId>
- <version>3.5.3version>
- dependency>
-
- <dependency>
- <groupId>com.plumeloggroupId>
- <artifactId>plumelog-traceartifactId>
- <version>3.5.3version>
- dependency>
- // 在启动类上添加包扫描路径,
- @ComponentScan({"com.plumelog","com.wf.admin.**"})
5.2. 在配置文件添加绑定redis的配置:
- plumelog:
- redis:
- appName: wf-us168-admin-service
- redisHost: 192.168.0.143:30360
- redisAuth: wanfu!@#
- redisDb: 0
5.3 logback-spring.xml:
-
- <configuration scan="true" scanPeriod="60 seconds" 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"/>
-
- <springProperty scope="context" name="service_name" source="spring.application.name"/>
-
- <property name="LOG_PATH" value="${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}"/>
- <property name="CONSOLE_LOG_PATTERN"
- value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-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}}"/>
- <property name="FILE_LOG_PATTERN"
- value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
-
- <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
- <encoder>
- <pattern>${CONSOLE_LOG_PATTERN}pattern>
- encoder>
- appender>
-
- <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${LOG_PATH}/${service_name}.logfile>
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <fileNamePattern>${LOG_PATH}/${service_name}-%d{yyyy-MM-dd}.logfileNamePattern>
- <maxHistory>${LOG_FILE_MAX_HISTORY:-0}maxHistory>
- rollingPolicy>
- <encoder>
- <pattern>${FILE_LOG_PATTERN}pattern>
- encoder>
- appender>
-
- <springProperty scope="context" name="plumelog.appName" source="plumelog.redis.appName"/>
- <springProperty scope="context" name="plumelog.redisHost" source="plumelog.redis.redisHost"/>
- <springProperty scope="context" name="plumelog.redisAuth" source="plumelog.redis.redisAuth"/>
- <springProperty scope="context" name="plumelog.redisDb" source="plumelog.redis.redisDb"/>
- <springProperty scope="context" name="plumelog.env" source="spring.profiles.active"/>
-
- <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>
-
-
-
-
- <springProfile name="dev">
- <root level="INFO">
- <appender-ref ref="CONSOLE"/>
-
- <appender-ref ref="FILE"/>
-
- <appender-ref ref="plumelog"/>
- root>
- springProfile>
- <springProfile name="fat">
- <root level="INFO">
- <appender-ref ref="CONSOLE"/>
- <appender-ref ref="plumelog"/>
- <appender-ref ref="FILE"/>
- root>
- springProfile>
- <springProfile name="test">
- <root level="INFO">
- <appender-ref ref="FILE" />
- root>
- springProfile>
- <springProfile name="prod">
- <root level="INFO">
- <appender-ref ref="FILE" />
- <appender-ref ref="plumelog"/>
- root>
- springProfile>
-
- configuration>
5.3 配置aop(我这里设置全局的traceId,如果要对某个请求设置trceId可以使用@Trace注解)
链路追踪有时可以有时不行,待处理。
启动项目并访问,查看plumelog页面
