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


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

    前言

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

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

    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 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    日志处理

    #日志样例
     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}")
    
    • 1
    • 2
    • 3
    • 4

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

    日志可视化图表

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

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

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

  • 相关阅读:
    万字长文深度剖析 RocketMQ 设计原理
    【React】redux和React-redux
    一文入门mybatis-plus
    C 格式转换说明符
    Visio——对齐方法的规则
    [Mono Depth/3DOD]单目3D检测基础
    Linux下Couchbase的安装&升级&维护最佳指南
    《自然语言处理实战:利用Python理解、分析和生成文本》读书笔记:第2章 构建自己的词汇表——分词
    【微信小程序】使用webstorm进行开发,支持代码提示高亮等
    报考PMP怕上当,都会遇到哪些坑,我该如何避开这些坑?
  • 原文地址:https://blog.csdn.net/power8988/article/details/132914462