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

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

前言

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

在日志处理过程中,使用 切分(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

* * * * * /bin/bash /root/log/aa.sh

2.配置 shell 变量(aa.sh)

#!/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),并添加各业务字段。

#!/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 )

#!/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

日志处理

#日志样例
 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 手册》

日志可视化图表

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

https://t.guance.com/0IVDO

如何通过日志切分优雅实现业务数据的提取和分析_第1张图片

如何通过日志切分优雅实现业务数据的提取和分析_第2张图片

如何通过日志切分优雅实现业务数据的提取和分析_第3张图片

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

你可能感兴趣的:(elk,微服务,java,性能优化)