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

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

前言

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

在日志处理过程中,使用 切分(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:后续补充业务关系逻辑图和价格趋势变化分析图

相关推荐
间彧1 小时前
Spring Cloud Gateway与Kong或Nginx等API网关相比有哪些优劣势?
后端
间彧1 小时前
如何基于Spring Cloud Gateway实现灰度发布的具体配置示例?
后端
间彧1 小时前
在实际项目中如何设计一个高可用的Spring Cloud Gateway集群?
后端
间彧1 小时前
如何为Spring Cloud Gateway配置具体的负载均衡策略?
后端
间彧1 小时前
Spring Cloud Gateway详解与应用实战
后端
爱吃喵的鲤鱼1 小时前
仿mudou——Connection模块(连接管理)
linux·运维·服务器·开发语言·网络·c++
让子弹飞021 小时前
永久解决ubuntu网络连接问题
linux·运维·ubuntu
EnCi Zheng2 小时前
SpringBoot 配置文件完全指南-从入门到精通
java·spring boot·后端
烙印6013 小时前
Spring容器的心脏:深度解析refresh()方法(上)
java·后端·spring
Lisonseekpan3 小时前
Guava Cache 高性能本地缓存库详解与使用案例
java·spring boot·后端·缓存·guava