• plumelog日志框架的搭建与使用


    背景:当我们的线上服务出了问题时,我们最先想到的是查看服务器日志。但是,传统的项目的日志一般都写在服务器的log文件中,非常不方便查阅。为了更好的查看线上的日志,我之前搭建了elk集群日志,虽然可以用kibana的discover查看,但是查看的日志特别乱,无法快速定位到哪个请求。于是,使用plumelog来代替elk日志,plumelog也是将日志写入到elasticsearch中,但是整体的页面更好看,方便查询。

    plumelog官网,使用流程按官方的文档配置即可。这里我列下我的整合文件,基于配置中心的logback日志。

    plumelog-server:

    1.pom.xml:

    1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2.         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    3.    <parent>
    4.        <groupId>com.plumeloggroupId>
    5.        <artifactId>plumelogartifactId>
    6.        <version>3.5version>
    7.    parent>
    8.    <modelVersion>4.0.0modelVersion>
    9.    <artifactId>plumelog-serverartifactId>
    10.    <name>plumelog-servername>
    11.    <properties>
    12.        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    13.        <redis.version>3.1.0redis.version>
    14.        <kafka.version>2.5.0kafka.version>
    15.        <springboot.version>2.6.3springboot.version>
    16.        <elasticsearch.version>7.7.0elasticsearch.version>
    17.        <spring-cloud.version>2021.0.1spring-cloud.version>
    18.        <spring-cloud-alibaba.version>2021.0.1.0spring-cloud-alibaba.version>
    19.    properties>
    20.    <dependencyManagement>
    21.        <dependencies>
    22.            <dependency>
    23.                <groupId>org.springframework.bootgroupId>
    24.                <artifactId>spring-boot-dependenciesartifactId>
    25.                <version>2.6.3version>
    26.                <type>pomtype>
    27.                <scope>importscope>
    28.            dependency>
    29.            <dependency>
    30.                <groupId>org.springframework.cloudgroupId>
    31.                <artifactId>spring-cloud-dependenciesartifactId>
    32.                <version>${spring-cloud.version}version>
    33.                <type>pomtype>
    34.                <scope>importscope>
    35.            dependency>
    36.            <dependency>
    37.                <groupId>com.alibaba.cloudgroupId>
    38.                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
    39.                <version>${spring-cloud-alibaba.version}version>
    40.                <type>pomtype>
    41.                <scope>importscope>
    42.            dependency>
    43.        dependencies>
    44.    dependencyManagement>
    45.    <dependencies>
    46.        <dependency>
    47.            <groupId>com.alibaba.cloudgroupId>
    48.            <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
    49.        dependency>
    50.        <dependency>
    51.            <groupId>com.alibaba.cloudgroupId>
    52.            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    53.        dependency>
    54.        <dependency>
    55.            <groupId>org.springframework.cloudgroupId>
    56.            <artifactId>spring-cloud-starter-bootstrapartifactId>
    57.        dependency>
    58.        <dependency>
    59.            <groupId>com.taobao.topgroupId>
    60.            <artifactId>lippi-oapi-encrptartifactId>
    61.            <version>dingtalk-SNAPSHOTversion>
    62.            <scope>systemscope>
    63.            <systemPath>${project.basedir}/lib/taobao-sdk-java-auto_1479188381469-20200701.jarsystemPath>
    64.        dependency>
    65.        <dependency>
    66.            <groupId>org.elasticsearch.clientgroupId>
    67.            <artifactId>elasticsearch-rest-clientartifactId>
    68.            <version>7.7.0version>
    69.        dependency>
    70.        <dependency>
    71.            <groupId>org.springframework.bootgroupId>
    72.            <artifactId>spring-boot-starter-webartifactId>
    73.            <exclusions>
    74.                <exclusion>
    75.                    <groupId>org.springframework.bootgroupId>
    76.                    <artifactId>spring-boot-starter-tomcatartifactId>
    77.                exclusion>
    78.            exclusions>
    79.        dependency>
    80.        <dependency>
    81.            <groupId>org.springframework.bootgroupId>
    82.            <artifactId>spring-boot-starter-jettyartifactId>
    83.        dependency>
    84.        <dependency>
    85.            <groupId>net.sourceforge.nekohtmlgroupId>
    86.            <artifactId>nekohtmlartifactId>
    87.        dependency>
    88.        <dependency>
    89.            <groupId>org.springframework.bootgroupId>
    90.            <artifactId>spring-boot-starter-thymeleafartifactId>
    91.        dependency>
    92.        <dependency>
    93.            <groupId>com.alibabagroupId>
    94.            <artifactId>fastjsonartifactId>
    95.            <version>1.2.62version>
    96.        dependency>
    97.        <dependency>
    98.            <groupId>junitgroupId>
    99.            <artifactId>junitartifactId>
    100.            <version>4.11version>
    101.            <scope>testscope>
    102.        dependency>
    103.        <dependency>
    104.            <groupId>com.plumeloggroupId>
    105.            <artifactId>plumelog-logbackartifactId>
    106.            <version>${version}version>
    107.        dependency>
    108.        <dependency>
    109.            <groupId>org.apache.lucenegroupId>
    110.            <artifactId>lucene-queryparserartifactId>
    111.            <version>7.7.3version>
    112.        dependency>
    113.        <dependency>
    114.            <groupId>org.apache.lucenegroupId>
    115.            <artifactId>lucene-highlighterartifactId>
    116.            <version>7.7.3version>
    117.        dependency>
    118.        <dependency>
    119.            <groupId>org.apache.lucenegroupId>
    120.            <artifactId>lucene-groupingartifactId>
    121.            <version>7.7.3version>
    122.        dependency>
    123.        <dependency>
    124.            <groupId>org.apache.commonsgroupId>
    125.            <artifactId>commons-ioartifactId>
    126.            <version>1.3.2version>
    127.        dependency>
    128.        <dependency>
    129.            <groupId>org.apache.lucenegroupId>
    130.            <artifactId>lucene-analyzers-smartcnartifactId>
    131.            <version>7.7.3version>
    132.        dependency>
    133.        <dependency>
    134.            <groupId>de.codecentricgroupId>
    135.            <artifactId>spring-boot-admin-starter-serverartifactId>
    136.            <exclusions>
    137.                <exclusion>
    138.                    <groupId>io.projectreactor.nettygroupId>
    139.                    <artifactId>reactor-nettyartifactId>
    140.                exclusion>
    141.            exclusions>
    142.            <version>2.6.3version>
    143.        dependency>
    144.        <dependency>
    145.            <groupId>io.projectreactor.nettygroupId>
    146.            <artifactId>reactor-nettyartifactId>
    147.            <version>0.9.10.RELEASEversion>
    148.        dependency>
    149.        <dependency>
    150.            <groupId>com.plumeloggroupId>
    151.            <artifactId>plumelog-luceneartifactId>
    152.            <version>3.5version>
    153.            <scope>compilescope>
    154.        dependency>
    155.    dependencies>
    156.    <build>
    157.        <plugins>
    158.            <plugin>
    159.                <groupId>org.apache.maven.pluginsgroupId>
    160.                <artifactId>maven-surefire-pluginartifactId>
    161.                <version>2.18.1version>
    162.                <configuration>
    163.                    <skipTests>trueskipTests>
    164.                configuration>
    165.            plugin>
    166.            <plugin>
    167.                <groupId>org.apache.maven.pluginsgroupId>
    168.                <artifactId>maven-deploy-pluginartifactId>
    169.                <version>2.8.2version>
    170.                <configuration>
    171.                    <skip>trueskip>
    172.                configuration>
    173.            plugin>
    174.            <plugin>
    175.                <groupId>org.springframework.bootgroupId>
    176.                <artifactId>spring-boot-maven-pluginartifactId>
    177.                <version>2.6.3version>
    178.                <configuration>
    179.                    <fork>truefork>
    180.                    <jvmArguments>-Dfile.encoding=UTF-8jvmArguments>
    181.                    <includeSystemScope>trueincludeSystemScope>
    182.                configuration>
    183.                <executions>
    184.                    <execution>
    185.                        <goals>
    186.                            <goal>repackagegoal>
    187.                        goals>
    188.                    execution>
    189.                executions>
    190.            plugin>
    191.            
    192.            <plugin>
    193.                <groupId>org.apache.maven.pluginsgroupId>
    194.                <artifactId>maven-resources-pluginartifactId>
    195.                <version>2.7version>
    196.                <executions>
    197.                    <execution>
    198.                        <id>copy-configid>
    199.                        <phase>packagephase>
    200.                        <goals>
    201.                            <goal>copy-resourcesgoal>
    202.                        goals>
    203.                        <configuration>
    204.                            <outputDirectory>${project.build.directory}/outputDirectory>
    205.                            <resources>
    206.                                <resource>
    207.                                    <directory>src/main/resourcesdirectory>
    208.                                    <includes>
    209.                                        <exclude>**/*.xmlexclude>
    210.                                        <exclude>**/*.confexclude>
    211.                                        <exclude>**/*.propertiesexclude>
    212.                                        <exclude>**/*.shexclude>
    213.                                        <exclude>**/*.batexclude>
    214.                                    includes>
    215.                                    <filtering>truefiltering>
    216.                                resource>
    217.                            resources>
    218.                            <encoding>UTF-8encoding>
    219.                        configuration>
    220.                    execution>
    221.                executions>
    222.            plugin>
    223.            <plugin>
    224.                <groupId>org.apache.maven.pluginsgroupId>
    225.                <artifactId>maven-jar-pluginartifactId>
    226.                <version>2.4version>
    227.                <configuration>
    228.                    <finalName>plumelog-serverfinalName>
    229.                    <excludes>
    230.                        <exclude>*.propertiesexclude>
    231.                    excludes>
    232.                configuration>
    233.            plugin>
    234.        plugins>
    235.    build>
    236. project>

    2.bootstrap.yaml:

    1. admin:
    2. log:
    3.   keepDays: 30
    4.   trace:
    5.     keepDays: 30
    6.  #管理密码,手动删除日志的时候需要输入的密码
    7. password: 123456
    8. #登录配置,配置后会有登录界面
    9. login:
    10. password: admin
    11. username: admin
    12. plumelog:
    13.  #elasticsearch相关配置,Hosts支持携带协议,如:http、https,集群逗号隔开,lite模式可以全部注释掉下面配置
    14. es:
    15.   esHosts: https://192.168.0.28:29200
    16.   indexType:
    17.     model: day
    18.   refresh:
    19.     interval: 30s
    20.   replicas: 1
    21.   shards: 5
    22.    #是否信任自签证书
    23.   trustSelfSigned: true
    24.   userName: elastic
    25.   passWord: elastic
    26.    #是否hostname验证
    27.    #hostnameVerification: false
    28.  #拉取时间间隔,kafka不生效
    29. interval: 100
    30.  #单次拉取日志条数
    31. maxSendSize: 500
    32. model: redis
    33. queue:
    34.   redis:
    35.     redisDb: 0
    36.     redisHost: 192.168.0.143:30360
    37.     redisPassWord: wanfu!@#
    38. ui:
    39.   url: http://demo.plumelog.com
    40. server:
    41. port: 8892
    42. spring:
    43. application:
    44.   name: plumelog-server
    45. boot:
    46.   admin:
    47.     context-path: admin
    48. mvc:
    49.   static-path-pattern: /plumelog/**
    50.   view:
    51.     prefix: classpath:/templates/
    52.     suffix: .html
    53. profiles:
    54.   active: fat
    55. thymeleaf:
    56.   mode: LEGACYHTML5
    57. cloud:
    58.   nacos:
    59.     server-addr: ${NACOS_ADDRESS:192.168.0.143:8848}
    60.     username: ${NACOS_USERNAME:nacos}
    61.     password: ${NACOS_PASSWORD:wanfu!@#}
    62.     config:
    63.       namespace: ${spring.profiles.active}
    64.       group: WF_GROUP
    65.       file-extension: yaml
    66.     discovery:
    67.       namespace: ${spring.profiles.active}
    68.       group: WF_GROUP

    1. logback-spring.xml:

      1. <configuration debug="false">
      2.  
      3.   <property name="LOG_HOME" value="/log" />
      4.  
      5.  
      6.  
      7.   <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
      8.   <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
      9.   <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
      10.  
      11.   <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}}"/>
      12.  
      13.   <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
      14.       <encoder>
      15.           <Pattern>${CONSOLE_LOG_PATTERN}Pattern>
      16.          
      17.           <charset>UTF-8charset>
      18.       encoder>
      19.   appender>
      20.  
      21.   <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
      22.       <filter class="com.plumelog.logback.util.FilterSyncLogger">
      23.           <level>infolevel>
      24.           <filterPackage>com.plumelog.trace.aspect.AbstractAspectfilterPackage>
      25.       filter>
      26.       <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      27.           <FileNamePattern>logs/plumelog-server.log.%d{yyyy-MM-dd}.logFileNamePattern>
      28.           <MaxHistory>3MaxHistory>
      29.       rollingPolicy>
      30.       <encoder>
      31.           <Pattern>${CONSOLE_LOG_PATTERN}Pattern>
      32.          
      33.           <charset>UTF-8charset>
      34.       encoder>
      35.   appender>
      36.  
      37.   <springProfile name="dev">
      38.       <root level="INFO">
      39.           <appender-ref ref="CONSOLE" />
      40.           <appender-ref ref="FILE" />
      41.       root>
      42.   springProfile>
      43.   <springProfile name="fat">
      44.       <root level="INFO">
      45.           <appender-ref ref="CONSOLE" />
      46.           <appender-ref ref="FILE" />
      47.       root>
      48.   springProfile>
      49.   <springProfile name="pro">
      50.       <root level="INFO">
      51.           <appender-ref ref="CONSOLE" />
      52.           <appender-ref ref="FILE" />
      53.       root>
      54.   springProfile>
      55. configuration>

    4.使用docker-compose部署plumelog-server

    4.1 dockerfile:

    1. FROM openjdk:11.0.12-jre-buster
    2. ADD application.jar /application.jar
    3. ADD bootstrap.yaml /bootstrap.yaml
    4. ADD logback-spring.xml /logback-spring.xml
    5. CMD ["java", "-jar", "-Dfile.encoding=UTF-8", "/application.jar"]

    4.2 docker-compose.yaml:

    1. version: "3"
    2. services:
    3. plume-server-fat:
    4.   image: fat/com.wf/plume-service
    5.   container_name: fat-plume-server
    6.   ports:
    7.     - 28891:8891
    8.   restart: always

    构建镜像:docker build -t fat/com.wf/plume-service .

    启动服务 docker-compose up -d

    访问ui界面:http://192.168.0.28:28891

    1. 配置客户端:

      5.1.添加相关jar包:

      1. <dependency>
      2.            <groupId>org.springframework.bootgroupId>
      3.            <artifactId>spring-boot-starter-aopartifactId>
      4.            <version>2.6.3version>
      5.        dependency>
      6.        <dependency>
      7.            <groupId>de.codecentricgroupId>
      8.            <artifactId>spring-boot-admin-starter-clientartifactId>
      9.            <version>2.6.3version>
      10.        dependency>
      11.        <dependency>
      12.            <groupId>com.plumeloggroupId>
      13.            <artifactId>plumelog-logbackartifactId>
      14.            <version>3.5.3version>
      15.        dependency>
      16.        <dependency>
      17.            <groupId>com.plumeloggroupId>
      18.            <artifactId>plumelog-traceartifactId>
      19.            <version>3.5.3version>
      20.        dependency>

      1. // 在启动类上添加包扫描路径,
      2. @ComponentScan({"com.plumelog","com.wf.admin.**"})

      5.2. 在配置文件添加绑定redis的配置:

      1. plumelog:
      2. redis:
      3.   appName: wf-us168-admin-service
      4.   redisHost: 192.168.0.143:30360
      5.   redisAuth: wanfu!@#
      6.   redisDb: 0

      5.3 logback-spring.xml:

      1. <configuration scan="true" scanPeriod="60 seconds" debug="false">
      2.    
      3.    
      4.    
      5.    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
      6.    <conversionRule conversionWord="wex"
      7.                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
      8.    <conversionRule conversionWord="wEx"
      9.                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
      10.    <springProperty scope="context" name="service_name" source="spring.application.name"/>
      11.    <property name="LOG_PATH" value="${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}"/>
      12.    <property name="CONSOLE_LOG_PATTERN"
      13.              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}}"/>
      14.    <property name="FILE_LOG_PATTERN"
      15.              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}}"/>
      16.    
      17.    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
      18.        <encoder>
      19.            <pattern>${CONSOLE_LOG_PATTERN}pattern>
      20.        encoder>
      21.    appender>
      22.    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
      23.        <file>${LOG_PATH}/${service_name}.logfile>
      24.        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      25.            <fileNamePattern>${LOG_PATH}/${service_name}-%d{yyyy-MM-dd}.logfileNamePattern>
      26.            <maxHistory>${LOG_FILE_MAX_HISTORY:-0}maxHistory>
      27.        rollingPolicy>
      28.        <encoder>
      29.            <pattern>${FILE_LOG_PATTERN}pattern>
      30.        encoder>
      31.    appender>
      32.    
      33.    <springProperty scope="context" name="plumelog.appName" source="plumelog.redis.appName"/>
      34.    <springProperty scope="context" name="plumelog.redisHost" source="plumelog.redis.redisHost"/>
      35.    <springProperty scope="context" name="plumelog.redisAuth" source="plumelog.redis.redisAuth"/>
      36.    <springProperty scope="context" name="plumelog.redisDb" source="plumelog.redis.redisDb"/>
      37.    <springProperty scope="context" name="plumelog.env" source="spring.profiles.active"/>
      38.    
      39.    <appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
      40.        <appName>${plumelog.appName}appName>
      41.        <redisHost>${plumelog.redisHost}redisHost>
      42.        <redisAuth>${plumelog.redisAuth}redisAuth>
      43.        <redisDb>${plumelog.redisDb}redisDb>
      44.        <env>${plumelog.env}env>
      45.    appender>
      46.    
      47.    
      48.    
      49.    
      50.    <springProfile name="dev">
      51.        <root level="INFO">
      52.            <appender-ref ref="CONSOLE"/>
      53.            
      54.            <appender-ref ref="FILE"/>
      55.            
      56.            <appender-ref ref="plumelog"/>
      57.        root>
      58.    springProfile>
      59.    <springProfile name="fat">
      60.        <root level="INFO">
      61.            <appender-ref ref="CONSOLE"/>
      62.            <appender-ref ref="plumelog"/>
      63.            <appender-ref ref="FILE"/>
      64.        root>
      65.    springProfile>
      66.    <springProfile name="test">
      67.        <root level="INFO">
      68.            <appender-ref ref="FILE" />
      69.        root>
      70.    springProfile>
      71.    <springProfile name="prod">
      72.        <root level="INFO">
      73.            <appender-ref ref="FILE" />
      74.            <appender-ref ref="plumelog"/>
      75.        root>
      76.    springProfile>
      77. configuration>

      5.3 配置aop(我这里设置全局的traceId,如果要对某个请求设置trceId可以使用@Trace注解)

    链路追踪有时可以有时不行,待处理。​

    启动项目并访问,查看plumelog页面

  • 相关阅读:
    js题解(二)
    基于图片相似度对视频进行抽帧
    通师高专科技创新社训练赛(20221130)
    [源码解析] TensorFlow 分布式环境(3)--- Worker 静态逻辑
    vue3Blog首页基础布局样式规划
    C++反转链表递归
    第十二章 Spring MVC 框架扩展和SSM框架整合(2023版本IDEA)
    京东数据分析平台:2023年8月京东奶粉行业品牌销售排行榜
    雅思写作拾遗01----图表类作文
    伪代码实现几种常见的时间复杂度算法
  • 原文地址:https://blog.csdn.net/Json_Marz/article/details/126120020