clickhouse中使用extract抽取关键信息

背景

我们的日志现在大部分都是直接存放的clickhouse的字符串类型的字段中的,一般来说我们的日志内容统一放在一个被称为message的字符串列中,在日常使用过程中,我们经常需要从message抽取满足指定模式的字段,那么本文就来讲解extract常用的几种抽取关键信息的方式

extract抽取关键信息

1.使用(\d+)配置整数值或者(.+)任意字符长度的抽取

[2023-07-09 01:42:27.423] [ERROR] [Common-Business-Thread-70] [com.vip.service] >>> userId:61562932,sql=(select * from user)##error

假设我们有如上的错误日志,我们想要从message这个log字符串的字段中抽取出来用户id以及错误的sql,那么我们应该怎么写sql语句呢?

select extract(message, 'userId:(\d+)') as userId, extract(message, 'sql=(.+)##') as sql
from clickhouse_log
where  notEmpty(extract(message, 'userId:')) and notEmpty(extract(message, 'sql='))
group by userId,sql

首先我们从clickhouse_log日志表中选择对应日志的行,然后通过(\d+)获取出来用户id,并通过(.+)获取满足任何字符的字符串,这里就是错误的sql表达式了
2.使用(\d+.\d+.\d+.\d+:\d+)抽取类似ip 127.0.0.1这种模式的日志

[2023-07-09 01:42:27.423] [ERROR] [Common-Business-Thread-70] [com.vip.service] >>> Read timeout redis node: 10.255.192.12:3608

假设我们有上面这种连接redis节点超时的日志,我们想要找到所有错误的redis节点信息,那么我们应该怎么写这个sql呢?

select extract(message, 'Read timeout redis node: (\d+\.\d+\.\d+\.\d+:\d+)') as ipport
from clickhouse_log
where notEmpty(extract(message, 'Read timeout redis node: '))
group by ipport

这样我们就可以获取到有问题的redis 的地址信息了。

你可能感兴趣的:(redis,clickhouse,clickhouse)