filebeat,kafka,clickhouse,ClickVisual搭建轻量级日志平台

springboot集成链路追踪

  • springboot版本
xml 复制代码
<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.6.3</version>
	<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
</dependencies>
  • 添加链路追踪sleuth依赖
    链路追踪有很多优秀的中间件,比如skywalking等,但是skywalking需要部署oap服务生成追踪id,为了减少架构复杂度,决定采用sleuth。
xml 复制代码
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-sleuth</artifactId>
	<version>3.1.1</version>
</dependency>

想进一步减少架构复杂度,也可以自定义生成traceId,可以参考之前的文章实现
https://blog.csdn.net/qq_41633199/article/details/127482748?spm=1001.2014.3001.5502

kafka2.7.1设置

bash 复制代码
bin\windows\zookeeper-server-start.bat config\zookeeper.properties
  • kafka设置
    • 配置数据存储
    • 配置zk连接
    • 启动
bash 复制代码
## 启动kafka
bin\windows\kafka-server-start.bat config\server.properties
## 创建主题
bin\windows\kafka-topics.bat --zookeeper localhost:2181 --create --replication-factor 1 --partitions 1 --topic app_log
## 查看主题
bin\windows\kafka-topics.bat --list --zookeeper localhost:2181
# 生产消息
bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic app_log
# 消息消费
bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic app_log --group app_log --from-beginning

应用日志logback配置

由于java异常日志输出堆栈的换行符会影响kafka engine日志解析(会当成多条日志分别解析导致报错),因此在FILE_FORMAT配置输出到日志文件的时候去除换行符。

xml 复制代码
<property name="CONSOLE_FORMAT" value="%highlight(%d{yyyy-MM-dd HH:mm:ss.SSS})|%highlight(%-5level{FATAL=Bright Red, ERROR=Bright Magenta, WARN=Bright Yellow, INFO=Bright Green, DEBUG=Bright Cyan, TRACE=Bright White})|%boldMagenta(%X{traceId})|%yellow(%thread)|%boldMagenta(%logger{36})|%green(%file#%method:%line)|%cyan(%msg%n)"/>
    <property name="FILE_FORMAT" value="%d{yyyy-MM-dd HH:mm:ss.SSS}|%level|%X{traceId}|%thread|%logger{36}|%file#%method:%line|%msg %replace(%ex){'[\r\n]+', ''}%nopex%n"/>

    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件输出的文件名 -->
            <FileNamePattern>${LOG_HOME}/info/bill_log.%d{yyyy-MM-dd_HH}.log</FileNamePattern>
            <!-- 日志文件保留个数 -->
            <maxHistory>168</maxHistory>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${FILE_FORMAT}</pattern>
        </encoder>
    </appender>
    <!-- 开发环境 -->
    <springProfile name="dev">
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>${CONSOLE_FORMAT}</pattern>
            </encoder>
        </appender>

        <root level="DEBUG">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="INFO_FILE"/>
        </root>
    </springProfile>

filebeat7.16.2收集应用日志推送kafka

  • 下载
bash 复制代码
https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.16.2-windows-x86_64.zip
  • 修改配置
    kafka配置官网参考地址
bash 复制代码
https://www.elastic.co/guide/en/beats/filebeat/7.16/kafka-output.html


设置传输kafka
确保output只有一个

  • 启动filebeat
    在安装目录执行启动命令
powershell 复制代码
filebeat -e -c filebeat.yml

访问应用查看kafka消费效果

clickhouse设置

  • 宿主机配置host
bash 复制代码
172.27.x.x host.docker.internal

由于clickhouse容器需访问本机kafka,需要解决通信问题

  • 启动
powershell 复制代码
docker run -d --network=bridge -p 8123:8123 -p 9000:9000 -p 9009:9009 --name clickhouse-svr --add-host="host.docker.internal:172.27.xx.x" clickhouse/clickhouse-server:24.4.3.25
  • 进入容器,执行命令设置分隔符保存到users.xml配置文件,以便重启容器后也能生效
    这里的设置主要取决于日志格式,我的项目是|号作为字段分隔符
bash 复制代码
set format_csv_delimiter = '|';
  • 连接clickhouse,设置允许查询引擎表
bash 复制代码
clickhouse-client --stream_like_engine_allow_direct_select 1
  • 选择数据库
bash 复制代码
use log;
  • 创建kafka引擎表
sql 复制代码
CREATE TABLE LOG_KAFKA
(
    time DateTime64(3, 'Asia/Shanghai'),
	level String,
	trace_id String,
	thread String,
	logger String,
	method String,
	msg String
)
ENGINE = Kafka()
SETTINGS kafka_broker_list = 'host.docker.internal:9092',
	kafka_topic_list = 'app_log',
	kafka_group_name = 'app_log',
	kafka_num_consumers = 1,
	kafka_format = 'CSV',
	format_csv_delimiter  = '|';
  • 创建分区日志表,存储日志消息
bash 复制代码
create table APP_LOG(
	time DateTime64(3, 'Asia/Shanghai'),
	level String,
	trace_id String,
	thread String,
	logger String,
	method String,
	msg String
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(time)
ORDER BY time;
## 创建Metrialized View 抓取数据到日志表
CREATE MATERIALIZED VIEW vw_app_log TO APP_LOG AS
SELECT time,level,trace_id,thread,logger,method,msg FROM LOG_KAFKA;
  • 访问应用生产日志消息并查看clickhouse日志

配置ClickVisual

bash 复制代码
docker run --name clickvisual -e EGO_CONFIG_PATH=/clickvisual/config/docker.toml -e EGO_LOG_WRITER=stderr -p 19001:19001 -v D:\download\clickvisual\config:/clickvisual/config -d clickvisual/clickvisual:latest
  • 配置数据连接
    用初始账号与密码clickvisual/clickvisual登录管理台http://localhost:19001
    点击初始化数据库后进入日志库配置页
    clickhouse数据源连接格式clickhouse://username:password@host1:9000,host2:9000/database?dial_timeout=200ms&max_execution_time=60,因为我未给clickhouse设置权限认证,因此username:password@可以省略
    创建好实例后回到日志页面,选择刚创建的实例右键接入已有日志库,配置日志数据表

查看效果

访问前面写的空指针异常接口,再刷新ClickVisual页面

通过链路id查询效果

相关推荐
hzulwy1 小时前
Kafka基础理论
分布式·kafka
明达智控技术2 小时前
MR30分布式IO在全自动中药煎药机中的应用
分布式·物联网·自动化
jakeswang3 小时前
细说分布式ID
分布式
失散134 小时前
分布式专题——1.2 Redis7核心数据结构
java·数据结构·redis·分布式·架构
王中阳Go5 小时前
头一次见问这么多kafka的问题
分布式·kafka
鼠鼠我捏,要死了捏5 小时前
Kafka Exactly-Once 语义深度解析与性能优化实践指南
kafka·exactly-once·performance-optimization
boonya6 小时前
Kafka核心原理与常见面试问题解析
分布式·面试·kafka
KIDAKN8 小时前
RabbitMQ 重试机制 和 TTL
分布式·rabbitmq
lifallen8 小时前
Kafka 内存池MemoryPool 设计
数据结构·kafka·apache
JAVA学习通8 小时前
【RabbitMQ】----初识 RabbitMQ
分布式·rabbitmq