plumelog介绍与应用-一个简单易用的java分布式日志系统

news2024/11/29 22:50:14

官方文档:http://www.plumelog.com/zh-cn/docs/FASTSTART.html

简介

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

架构

在这里插入图片描述

  • 应用服务通过整合plumelog客户端,搜集日志并推送kafka,redis等队列
  • plumelog-server 负责把队列中的日志日志异步写入到elasticsearch
  • plumelog_ui为操作界面客户端,用于查询日志,使用各种定制功能

常见部署模型

  • 单redis小集群模式,大部分中小规模项目
    在这里插入图片描述
  • kafka集群模式,每个项目量都很大
    在这里插入图片描述

功能

日志查询

在这里插入图片描述

扩展字段

  1. 在系统扩展字段里添加扩展字段,字段值为 orderid 显示值为 订单编号

  2. 查询的时候选择应用名,下面会显示扩展字段,可以通过扩展字段查询

MDC.put("orderid","1");
MDC.put("userid","4");
logger.info("扩展字段");

链路追踪

设置追踪码后,支持注解手动打点和切面全局打点

滚动日志

可以连接到机器上,查看实时日志
在这里插入图片描述

错误统计

错误报警

支持通过webhook自定义报警

索引管理

查看和操作ES索引

plumelog&ELK

  1. plumelog日志是客户端上报的方式,客户端配置极其简单,不需要像logstash一样去解析日志的格式,因为plumelog客户端已经格式化好了,traceid的设计都是内置的,这些用户都不用刻意去管,跨线程跨应用链路传递都是内置的组件
  2. 部署简单,你只要个有redis,就行了,ELK组合要完成完整部署,可能还需要配置kafka,filebeat之类的组件,而且版本需统一
  3. 日志的查询速度大于ELK,因为plumelog查询是优化过的,比kibanna通用查询快很多,plumelog的查询界面就是专门按照国人习惯设计的
  4. 很多人用ELK到了大量日志的时候发现,检索效率极其下降,那是因为ES的索引等设计不合理造成的,plumelog专业处理日志,索引的设置都已经早就设计好了,不需要使用者自己去优化
  5. ELK不是专业处理日志的,plumelog在日志上功能就很多,例如扩展字段,链路追踪,错误报警,错误统计后续还有QPS统计等功能,ELK都是没有的

多大体量

根据用户反馈,目前搜集到最大的用户每日日志量已经到达3TB,并稳定运行

部署应用

第一步:安装 redis 或者 kafka(一般公司redis足够) redis 官网:https://redis.io kafka:http://kafka.apache.org

第二步:安装 elasticsearch 官网下载地址:https://www.elastic.co/cn/downloads/past-releases

第三步:下载安装包,plumelog-server 下载地址:https://gitee.com/plumeorg/plumelog/releases

第四步:配置plumelog-server,并启动,redis和kafka作为队列模式下可以部署多个plumelog-server达到高可用,配置一样即可

第五步:后台查询语法详见plumelog使用指南

应用案例

以mservice为例,查询线上问题时,提供的是用户Id或订单号

之前查日志:

  1. 根据custId找到udid,根据订单号找到custId再找到udid。
  2. 到kibana根据udid和时间点找到对应的请求记录,找到对应的机器,找到请求的唯一标识“tc”
  3. 登录机器,根据“tc”参数查询elk日志,找到对应的线程号。
  4. 根据线程号和时间范围过滤default日志。

现在查询日志:

  1. 登录plumeLog页面,根据用户Id或订单号查询,即可查询到关键日志,大致定位问题。
  2. 根据日志的hostIp参数登录到机器根据追踪码过滤即可得到详细日志。

整合过程

  1. pom添加依赖

    <dependency>
        <groupId>com.plumelog</groupId>
        <artifactId>plumelog-logback</artifactId>
        <version>3.5.2</version>
    </dependency>
    
  2. logback.xml添加appender,注意区分测试和线上环境

    <appenders>
        <!--使用redis启用下面配置-->
        <appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
            <appName>plumelog</appName>
            <redisHost>172.16.249.72:6379</redisHost>
            <redisAuth>123456</redisAuth>
        </appender>
        <!-- 使用kafka启用下面配置 -->
        <appender name="plumelog" class="com.plumelog.logback.appender.KafkaAppender">
            <appName>plumelog</appName>
            <kafkaHosts>172.16.247.143:9092,172.16.247.60:9092,172.16.247.64:9092</kafkaHosts>
        </appender>
        <!-- 使用lite模式启用下面配置 -->
        <appender name="plumelog" class="com.plumelog.logback.appender.LiteAppender">
            <appName>worker</appName>
            <plumelogHost>localhost:8891</plumelogHost>
        </appender>
    </appenders>
            <!--使用上面三个三选一加入到root下面-->
    <root level="INFO">
    	<appender-ref ref="plumelog"/>
    </root>
    
     <!-- 结合环境配置案例-->
    <springProfile name="dev">
        <root level="INFO">
            <appender-ref ref="plumelog" />
        </root>
    </springProfile>
    <springProfile name="test">
        <root level="INFO">
            <appender-ref ref="plumelog" />
        </root>
    </springProfile>
    <springProfile name="prod">
        <root level="INFO">
            <appender-ref ref="plumelog" />
        </root>
    </springProfile>
    
  3. 代码调整输出日志

    1. 当前只把部分关键日志输出到plumeLog,可以解决大部分问题,每条日志都有机器IP
    2. 把用户Id作为扩展字段,方便搜索。
    3. 链路追踪:将“tc”参数作为追踪码,调用交易时,将其放到head中传给交易,可以直接根据追踪码搜索,串联mservice和交易系统。
    4. 将“tc”参数放到MDC中,输出到日志头,可以直接根据“tc”参数过滤日志
  4. 下载server包,调整server配置文件

   spring.application.name=plumelog_server
   spring.profiles.active=test-confidential
   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
   
   #值为4种 redis,kafka,rest,restServer
   #redis 表示用redis当队列
   #kafka 表示用kafka当队列
   #rest 表示从rest接口取日志
   #restServer 表示作为rest接口服务器启动
   #ui 表示单独作为ui启动
   #lite 简易模式启动不需要配置redis等
   plumelog.model=kafka
   #plumelog.lite.log.path=/Users/chenlongfei/lucene
   # 如果使用kafka,启用下面配置
   plumelog.kafka.kafkaHosts=broker.kafka.mid:443,broker.kafka.mid:443
   plumelog.kafka.kafkaGroupName=logConsumer
   
   #队列redis地址,model配置redis集群模式,哨兵模式用逗号隔开,队列redis不支持集群模式
   #plumelog.queue.redis.redisHost=127.0.0.1:6379
   #如果使用redis有密码,启用下面配置
   #plumelog.queue.redis.redisPassWord=123456
   #plumelog.queue.redis.redisDb=0
   #哨兵模式需要配置的
   #plumelog.queue.redis.sentinel.masterName=myMaster
   
   #管理端redis地址 ,集群用逗号隔开,不配置将和队列公用
   plumelog.redis.redisHost=127.0.0.1:8389,127.0.0.1:8388
   #如果使用redis有密码,启用下面配置
   #plumelog.redis.redisPassWord=123456
   #plumelog.redis.redisDb=0
   #哨兵模式需要配置的
   #plumelog.redis.sentinel.masterName=myMaster
   
   #如果使用rest,启用下面配置
   #plumelog.rest.restUrl=http://127.0.0.1:8891/getlog
   #plumelog.rest.restUserName=plumelog
   #plumelog.rest.restPassWord=123456
   
   #redis解压缩模式,开启后不消费非压缩的队列
   #plumelog.redis.compressor=true
   
   #elasticsearch相关配置,Hosts支持携带协议,如:http、https
   plumelog.es.esHosts=127.0.0.1:9200
   plumelog.es.shards=5
   plumelog.es.replicas=0
   plumelog.es.refresh.interval=30s
   #日志索引建立方式day表示按天、hour表示按照小时
   plumelog.es.indexType.model=day
   #plumelog.es.maxShards=100000
   #ES设置密码,启用下面配置
   #plumelog.es.userName=elastic
   #plumelog.es.passWord=elastic
   #是否信任自签证书
   #plumelog.es.trustSelfSigned=true
   #是否hostname验证
   #plumelog.es.hostnameVerification=false
   
   #单次拉取日志条数
   plumelog.maxSendSize=100
   #拉取时间间隔,kafka不生效
   plumelog.interval=100
   
   #plumelog-ui的地址 如果不配置,报警信息里不可以点连接
   plumelog.ui.url=http://plumelog.ck.api:8891
   
   #管理密码,手动删除日志的时候需要输入的密码
   admin.password=123456
   
   #日志保留天数,配置0或者不配置默认永久保留
   admin.log.keepDays=30
   #链路保留天数,配置0或者不配置默认永久保留
   admin.log.trace.keepDays=30
   #登录配置,配置后会有登录界面
   #login.username=admin
   #login.password=admin
  1. 部署server,当前已部署6个pod。
  2. 当前实际应用中,日常每天日志总量200多万条。2G左右。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/951584.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv5 如何计算并打印 FPS

文章用于学习记录 YOLO v5 FPS计算方法修改对应自己数据集的 yaml 文件以及训练好的 pt 文件以及batch-size1, FPS 1000ms/(0.311.91.0)pre-process&#xff1a;图像预处理时间&#xff0c;包括图像保持长宽比缩放和padding填充&#xff0c;通道变换&#xff08;HWC->CHW&a…

vr健康管理服务情景化教学弥补现代医学教学中的诸多不足之处

高职高专临床医学院校以培养岗位胜任力为目的&#xff0c;该专业是一门专业性、实践性较强的医学学科&#xff0c;要求培养出来的学生具有较强的临床实践能力&#xff0c;医学生所学的全部知识&#xff0c;都应与实践相结合&#xff0c;解决临床的实际问题&#xff0c;为患者解…

sql server 备份到网络共享

场景&#xff1a;sql server服务器A将数据库备份文件备份到服务器B 1&#xff09;服务器B创建共享目录 这里我将 D:\ProDbBak 共享&#xff0c;并且Everyone完全控制 2&#xff09;sql server服务器A能够访问服务器B共享目录&#xff0c;并且能完全控制 3&#xff09;修改服务…

GPT-3在化学中进行低数据发现是否足够?

今天介绍一份洛桑联邦理工学院进行的工作&#xff0c;这份工作被发表在化学期刊预印本网站上。 对于这份工作&#xff0c;有兴趣的朋友可以通过我们的国内ChatGPT镜像站进行测试使用&#xff0c;我们的站点并没有针对特定任务进行建设&#xff0c;是通用性质的。 化学领域进行…

QTday1(实现图形化界面、QT工程项目各文件初始程序的介绍)

1.实现图形化界面 #include "widget.h" #include "ui_widget.h" #include <QDebug> //输出函数对应的头文件 #include <QIcon>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(…

Ansible学习笔记11

Command和Shell模块&#xff1a; 两个模块都是用于执行Linux命令的&#xff0c;这个对于命令熟悉的工程师来说&#xff0c;用起来非常high。 Shell模块跟Command模块差不多&#xff08;Command模块不能执行一类$HOME、> 、<、| 等符号&#xff0c;但是Shell是可以的。&…

MySQL函数和约束

MySQL常见函数 字符串常见函数 # concat : 字符串拼接 select concat(Hello , MySQL); # lower : 全部转小写 SELECT LOWER(Hello); # upper : 全部转大写 SELECT UPPER(hello); # lpad : 左填充 SELECT LPAD(hello,10,0); # rpad : 右填充 SELECT RPAD(hello,10,0); # trim…

K8S容器OOM killed排查

背景 数据服务平台南海容器k8s设置的内存上限2GB&#xff0c;多次容器被OOM killed。 启动命令 java -XX:MaxRAMPercentage70.0 -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/apps/logs/ ***.jar排查过程 1 当收到实例内存超过95%告警时&#xff0c;把jvm进程堆dump下…

kotlin 转 Java

今天突然想研究下有些kotlin文件转为Java到底长什么样&#xff0c;好方便优化kotlin代码&#xff0c;搞了半天发现一个非常简单的Android Studio或者Intellij idea官方插件Kotlin&#xff0c;Kotlin是插件的名字&#xff0c;真是醉了&#xff1b; 这里以AS为例&#xff0c;使用…

git在windows上安装

介绍git工具在windows上如何安装 git官网下载地址 1.1、下载 https://github.com/git-for-windows/git/releases/download/v2.36.0.windows.1/Git-2.36.0-64-bit.exe自行选择版本&#xff0c;这里我选择的是 Git-2.36.0-64-bit这个版本 1.2、安装 安装路径选择英文且不带空格…

九、适配器模式

一、什么是适配器模式 适配器模式&#xff08;Adapter&#xff09;的定义如下&#xff1a;将一个类的接口转换成客户希望的另外一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的那些类能一起工作。 适配器模式&#xff08;Adapter&#xff09;包含以下主要角色&…

OpenVPN服务器

目录 一、OpenVPN是什么&#xff1f; 二、OpenVPN连接建立的过程 三、数据包远程传输处理过程&#xff08;自我理解&#xff09; 四、OpenVPN实验案例 4.1生成OpenVPN所需证书文件 4.2配置OpenVPN服务器 4.3配置OpenVPN客户端 4.4在远程客户端windows 10上进行测试 一、OpenVPN…

HTML5之drawImage函数

参数说明&#xff1a; drawImage(image, x, y) //按原图片大小绘制。 drawImage(image, x, y, width, height) //按指定大小绘制。 drawImage(image, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight) //常用于图片裁剪。 其中&#xff1a…

实战:基于卷积的MNIST手写体分类

前面实现了基于多层感知机的MNIST手写体识别&#xff0c;本章将实现以卷积神经网络完成的MNIST手写体识别。 1. 数据的准备 在本例中&#xff0c;依旧使用MNIST数据集&#xff0c;对这个数据集的数据和标签介绍&#xff0c;前面的章节已详细说明过了&#xff0c;相对于前面章…

对比Flink、Storm、Spark Streaming 的反压机制

分析&回答 Flink 反压机制 Flink 如何处理反压? Storm 反压机制 Storm反压机制 Storm 在每一个 Bolt 都会有一个监测反压的线程&#xff08;Backpressure Thread&#xff09;&#xff0c;这个线程一但检测到 Bolt 里的接收队列&#xff08;recv queue&#xff09;出现了…

C++笔记之临时变量与临时对象与匿名对象

C笔记之临时变量与临时对象与匿名对象 code review! 文章目录 C笔记之临时变量与临时对象与匿名对象1.C中的临时变量指的是什么&#xff1f;2.C中的临时对象指的是什么&#xff1f;3.C中临时对象的作用是什么&#xff1f;什么时候要用到临时对象?4.给我列举具体的例子说明临…

idm下载视频

idm下载视频 安装后 地址为&#xff1a; 链接&#xff1a;下载地址 提取码&#xff1a;fgzv 安装后 设置浏览器插件 完成 参考文章

自动驾驶和辅助驾驶系统的概念性架构(二)

摘要&#xff1a; 本篇为第二部分主要介绍底层计算单元、示例工作负载 前言 本文档参考自动驾驶计算联盟(Autonomous Vehicle Computing Consortium)关于自动驾驶和辅助驾驶计算系统的概念系统架构。该架构旨在与SAE L1-L5级别的自动驾驶保持一致。本文主要介绍包括功能模块图…

自从学了C++之后,小雅兰就有对象了!!!(类与对象)(下)——“C++”

各位CSDN的uu们好呀&#xff0c;好久没有更新啦&#xff0c;今天继续类和对象的内容&#xff0c;下面&#xff0c;让我们进入西嘎嘎类和对象的世界吧&#xff01;&#xff01;&#xff01; 1. 再谈构造函数 2. Static成员 3. 友元 4. 内部类 5.匿名对象 6.拷贝对象时的一些…

设计模式的使用——模板方法模式+动态代理模式

一、需求介绍 现有自己写的的一套审批流程逻辑&#xff0c;由于代码重构&#xff0c;需要把以前的很多业务加上审批的功能&#xff0c;再执行完审批与原有业务之后&#xff0c;生成一个任务&#xff0c;然后再统一处理一个任务&#xff08;本来是通过数据库作业去处理的&#x…