如何通过日志切分优雅实现业务数据的提取和分析

作者 观测云 产品服务团队 北京办公室 技术经理 苏桐桐

前言

日志是系统中的重要数据来源之一,包含了丰富的信息,可以帮助我们更好地了解系统的运行状况和问题。但是,由于日志数据往往是杂乱无章的,需要进行处理和转化才能变得有用。

在日志处理过程中,使用 切分(pipeline) 可以带来很多好处。通过 pipeline 进行日志处理可以高效地处理日志数据、转换日志的可读性、简化数据处理、改善数据分析、实现实时性等。可以帮助我们更好地理解和分析系统的行为模式,及时发现和解决系统问题,避免损失和风险。

什么是 Pipeline?

在计算机编程中,Pipeline 通常是指一种将数据在多个阶段处理的模式,其中每个阶段都执行特定的操作,将其传递给下一个阶段进行进一步处理,直到最终输出结果。Pipeline通常被用于处理大量数据,以实现更高效、可靠、可扩展的数据处理流程。

在软件开发中,Pipeline还可以指一种将软件开发过程中的各个步骤组合在一起的模式。例如,持续集成和持续交付过程中的各个步骤可以组成一个Pipeline,以便自动化整个软件开发过程。

在日志处理中,Pipeline通常指将日志数据通过多个阶段的处理,以实现将原始日志数据转换为可读、可查询、可视化的格式。例如,将日志数据收集、解析、过滤、转换、聚合、存储、查询和可视化等阶段组合在一起,形成一个完整的Pipeline,以实现日志数据的处理和分析。

在观测云中,Pipeline 支持对不同格式的日志数据进行文本解析,通过编写 Pipeline 脚本,可以自定义切割出符合要求的结构化日志,并把切割出来的字段作为属性使用。通过属性字段,我们可以快速筛选相关日志、进行数据关联分析,帮助我们快速去定位问题并解决问题。

采集日志方式

观测云采集日志主要有以下几种方式:

  • 采集日志文件
  • 采集器stdout日志
  • 远程推送日志
  • Sidecar方式采集
  • Kafka方式采集
  • 第三方开源系统对接

具体内容详见观测云日志最佳实践

日志分析

日志是系统运行的重要记录,包含了丰富的信息,但是日志数据往往是杂乱无章的,需要进行处理和转化才能变得有用。通过 Pipeline 进行日志处理有以下几个主要原因:

  1. 处理日志的高效性:通过 pipeline 进行日志处理,可以把不同来源的日志进行整合,筛选出需要的日志信息,使数据更加规整和易于分析。
  2. 转换日志的可读性:通过 pipeline 进行日志处理,可以将日志数据转换为易于阅读和理解的格式,例如,将 JSON 格式的日志数据转换为表格或图表的形式。
  3. 简化数据处理:通过 pipeline 可以自动化处理日志数据,避免手动处理所带来的错误和延迟。
  4. 改善数据分析:通过 pipeline 进行日志处理,可以将日志数据与其他系统数据结合,更好地理解和分析系统的行为模式。
  5. 实现实时性:通过 pipeline 进行日志处理,可以实现实时处理和分析日志数据,及时发现和解决系统问题,避免损失和风险。

综上所述,通过 Pipeline 进行日志处理可以提高数据处理的效率和准确性、简化数据分析的复杂度、实现实时性和及时性、更好地理解和分析系统的行为模式。

样例日志准备

准备某测试日志,使用 shell 编写并进行定时任务触发。

1.创建 crontab

bash 复制代码
* * * * * /bin/bash /root/log/aa.sh

2.配置 shell 变量(aa.sh

bash 复制代码
#!/bin/bash

. /etc/profile
. ~/.bash_profile
sh /root/log/bb.sh > /root/log/log.txt 
sh /root/log/modify_log_timestamps.sh 

3.生成业务测试日志(bb.sh),并添加各业务字段。

bash 复制代码
#!/bin/bash

. /etc/profile
. ~/.bash_profile

# 商品名称列表
products=("沐浴露" "洗面奶" "牙膏" "洗发水" "护发素" "剃须刀" "指甲剪" "浴帽" "梳子" "牙刷" "肥皂" "香皂" "面膜" "眼霜" "乳液" "防晒霜" "粉底液" "口红" "唇膏" "睫毛膏" "眉笔" "眼线笔" "眼影" "腮红" "粉饼" "卸妆油" "洗衣液" "洗洁精" "玻璃清洁剂" "洁厕液" "消毒液" "洗手液" "抽纸" "卫生巾" "牛奶" "饮料" "面包" "糖果" "巧克力" "薯片" "饼干" "方便面" "米饭" "饺子" "炸鸡" "汉堡" "披萨" "寿司" "火锅")

# 生成指定数量的日志
for (( i=1; i<=100; i++ )); do
  # 随机生成时间戳
  timestamp=$(date -d "$(($RANDOM % 24)):$(( $RANDOM % 60)):$(( $RANDOM % 60)) $((RANDOM % 30)) days ago" +"%Y-%m-%d %H:%M:%S")

  # 随机生成事件类型
  event_types=("INFO" "ERROR" "WARNING")
  event_type=${event_types[$RANDOM % ${#event_types[@]}]}

  # 随机生成订单号
  order_no=$(shuf -i 100000000-999999999 -n 1)

  # 随机生成姓名
  names=("王雨薇" "陈晓晖" "李泽洋" "王云霞" "刘明珠" "张雅雯" "周浩东" "李敏捷" "赵舒涵" "赵鹏程" "李正豪" "韩晓涵" "高文静" "徐浩翔" "刘艳丽" "朱明杰" "王佳敏" "赵凯峰" "胡艳青" "孙宇飞" "魏雪峰" "王冠宇" "刘冬梅" "贺芳芳" "杨超越" "王宇航" "吕莉莉" "郝佳佳" "刘海燕" "张伟男" "李世杰" "张文静" "赵子轩" "郑琳琳" "王子璇" "王天翔" "张丽华" "李梦雅" "高亚男" "赵娜娜" "陈强" "刘海宁" "李锦锦" "刘春雨" "郝婷婷" "蒋伟" "张亚男" 
)
  name=${names[$RANDOM % ${#names[@]}]}

  # 随机生成商品名称
  product_name=${products[$RANDOM % ${#products[@]}]}

  #随机生成省份

  provinces=("anhui" "aomen" "beijing" "chongqing" "fujian" "gansu" "guangdong" "guangxi" "guizhou" "hainan" "hebei" "heilongjiang" "henan" "hubei" "hunan" "jiangsu" "jiangxi" "jilin" "liaoning" "neimenggu" "ningxia" "qinghai" "shandong" "shanghai" "shanxi" "sichuan" "taiwan" "tianjin" "xianggang" "xinjiang" "xizang" "yunnan" "zhejiang")

  province=${provinces[$RANDOM % ${#provinces[@]}]}

  # 随机生成商品ID和trace_id
  trace_id=$(shuf -i 1000000000000-9999999999999 -n 1)
  span_id=$(shuf -i 10000000000000-99999999999999 -n 1)

  # 将生成的日志打印到控制台
  echo "$timestamp $event_type PURCHASE $order_no $name 购买了商品$product_name $product_name $province $trace_id $span_id"
done

4.修改日志日期,并进行排序(modify_log_timestamps.sh )

bash 复制代码
#!/bin/bash

. /etc/profile
. ~/.bash_profile

cd /root/log

# 获取当前日期
current_date=$(date +%Y-%m-%d)

# 遍历日志文件中的每一行
while read -r line; do
    # 查找日志中的日期
    date=$(echo "$line" | awk '{print $1}')
    if [[ -n $date ]]; then
        # 替换日期为当前日期
        new_date="$current_date"
        new_line=$(echo "$line" | sed "s/$date/$new_date/g")
        echo "$new_line"
    else
        echo "$line"
    fi
done < log.txt | sort -k1.1 -k1.2 -k1.3 > sorted_log.txt

日志处理

yaml 复制代码
#日志样例
 2023-05-04 23:11:01 WARNING PURCHASE 181369050 贺芳芳 购买了商品炸鸡 炸鸡 guangxi 5181246335474 59621747137922
#pipeline切割
grok(_, "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:status} %{NOTSPACE:type} %{NOTSPACE:APPid} %{NOTSPACE:name} %{NOTSPACE:appmsg} %{NOTSPACE:project_name} %{NOTSPACE:province} %{NOTSPACE:trace_id} %{NOTSPACE:span_id}")

具体处理可参考文档《Pipeline 手册》

日志可视化图表

通过观测云仪表板功能搭建日志可视化图表

t.guance.com/0IVDO

ps:后续补充业务关系逻辑图和价格趋势变化分析图

相关推荐
行百里er5 小时前
WebSocket 在 Spring Boot 中的实战解析:实时通信的技术利器
spring boot·后端·websocket
每日出拳老爷子6 小时前
【远程协助】内网 IT 运维远程协助系统的最小可用架构
运维·服务器·远程工作·流媒体·视音频
柳杉6 小时前
建议收藏 | 2026年AI工具封神榜:从Sora到混元3D,生产力彻底爆发
前端·人工智能·后端
weixin_462446236 小时前
使用 Puppeteer 设置 Cookies 并实现自动化分页操作:前端实战教程
运维·前端·自动化
仙俊红6 小时前
spring的IoC(控制反转)面试题
java·后端·spring
小楼v6 小时前
说说常见的限流算法及如何使用Redisson实现多机限流
java·后端·redisson·限流算法
与遨游于天地7 小时前
NIO的三个组件解决三个问题
java·后端·nio
czlczl200209257 小时前
Guava Cache 原理与实战
java·后端·spring
Yuer20258 小时前
什么是 Rust 语境下的“量化算子”——一个工程对象的最小定义
开发语言·后端·rust·edca os·可控ai
实战项目8 小时前
软件测试自动化框架的设计与实现
运维·自动化