日志服务数据加工最佳实践: 特定格式文本的加工

简介: 本篇介绍日志服务数据加工最佳实践: 特定格式文本的数据加工, 覆盖非标准JSON对象, XML文本, 类Logstash配置等

![](http://yunlei-statics.cn-hangzhou.log.aliyuncs.com/logstores/blog-tracking/track_ua.gif?APIVersion=0.6.0&blog=日志服务数据加工最佳实践: 特定格式文本的加工&src=yq&author=laiqiang.dlq)
本部分实践案例主要是根据在实际工作中的工单需求产生。接下来将从工单需求,加工编排(解决方案)等几个方面给读者解答如何使用LOG DSL编排解决任务需求。

场景:非标准JSON对象转JSON展开

需要对收集的dict数据进行二次嵌套展开操作。解决方案是先将dict数据转成json数据,然后使用e_json函数进行展开即可。

原始日志

在控制台收集到的日志格式是dict格式,如下所示:

content: {
    'referer': '-',
    'request': 'GET /phpMyAdmin',
    'status': 404,
    'data-1': {
        'aaa': 'Mozilla',
        'bbb': 'asde'
    },
    'data-2': {
        'up_adde': '-',
        'up_host': '-'
    }
}

LOG DSL编排

1、首先是对上述content数据做转json格式数据处理

e_set("content_json",str_replace(ct_str(v("content")),"'",'"'))

此时经过处理后的日志为:

content: {
    'referer': '-',
    'request': 'GET /phpMyAdmin',
    'status': 404,
    'data-1': {
        'aaa': 'Mozilla',
        'bbb': 'asde'
    },
    'data-2': {
        'up_adde': '-',
        'up_host': '-'
    }
}
content_json:  {
    "referer": "-",
    "request": "GET /phpMyAdmin",
    "status": 404,
    "data-1": {
        "aaa": "Mozilla",
        "bbb": "asde"
    },
    "data-2": {
        "up_adde": "-",
        "up_host": "-"
    }
}

2、对经过处理后的标准化的content_json数据进行展开。比如要展开第一层只需要设定JSON中的depth参数为1即可

e_json("content_json",depth=1,fmt='full')

此时的展开的的日志为:

content_json.data-1:  {"aaa": "Mozilla", "bbb": "asde"}
content_json.data-2:  {"up_adde": "-", "up_host": "-"}
content_json.referer:  -
content_json.request:  GET /phpMyAdmin
content_json.status:  404

如果depth设置为2,则展开的日志为:

content_json.data-1.aaa:  Mozilla
content_json.data-1.bbb:  asde
content_json.data-2.up_adde:  -
content_json.data-2.up_host:  -
content_json.referer:  -
content_json.request:  GET /phpMyAdmin
content_json.status:  404

3、综上LOG DSL规则可以如以下形式:

e_set("content_json",str_replace(ct_str(v("content")),"'",'"'))
e_json("content_json",depth=2,fmt='full')

加工后数据

加工后的数据是按照depth为2处理的,具体形式如下:

content:  {
    'referer': '-',
    'request': 'GET /phpMyAdmin',
    'status': 404,
    'data-1': {
        'aaa': 'Mozilla',
        'bbb': 'asde'
    },
    'data-2': {
        'up_adde': '-',
        'up_host': '-'
    }
}
content_json:  {
    "referer": "-",
    "request": "GET /phpMyAdmin",
    "status": 404,
    "data-1": {
        "aaa": "Mozilla",
        "bbb": "asde"
    },
    "data-2": {
        "up_adde": "-",
        "up_host": "-"
    }
}
content_json.data-1.aaa:  Mozilla
content_json.data-1.bbb:  asde
content_json.data-2.up_adde:  -
content_json.data-2.up_host:  -
content_json.referer:  -
content_json.request:  GET /phpMyAdmin
content_json.status:  404

场景:其他格式的文本转JSON格式展开

对于一些非标准的json格式数据,如果进行展开操作可以考虑组合规则的形式进行操作

原始日志

原始日志收集到的格式如以下格式:

content : {
    "pod" => {
        "name" => "crm-learning-follow-7bc48f8b6b-m6kgb"
    }, "node" => {
        "name" => "tw5"
    }, "labels" => {
        "pod-template-hash" => "7bc48f8b6b", "app" => "crm-learning-follow"
    }, "container" => {
        "name" => "crm-learning-follow"
    }, "namespace" => "testing1"
}

LOG DSL编排

1、首先对日志格式进行转换json形式,可以使用str_logtash_config_normalize函数进行转换,操作如下:

e_set("normalize_data",str_logtash_config_normalize(v("content")))

2、展开操作可以使用JSON函数,具体如下:

e_json("normalize_data",depth=1,fmt='full')

3、综上LOG DSL规则可以如以下形式:

e_set("normalize_data",str_logtash_config_normalize(v("content")))
e_json("normalize_data",depth=1,fmt='full')

加工后数据

content : {
    "pod" => {
        "name" => "crm-learning-follow-7bc48f8b6b-m6kgb"
    }, "node" => {
        "name" => "tw5"
    }, "labels" => {
        "pod-template-hash" => "7bc48f8b6b", "app" => "crm-learning-follow"
    }, "container" => {
        "name" => "crm-learning-follow"
    }, "namespace" => "testing1"
}
normalize_data:  {
    "pod": {
        "name": "crm-learning-follow-7bc48f8b6b-m6kgb"
    },
    "node": {
        "name": "tw5"
    },
    "labels": {
        "pod-template-hash": "7bc48f8b6b",
        "app": "crm-learning-follow"
    },
    "container": {
        "name": "crm-learning-follow"
    },
    "namespace": "testing1"
}
normalize_data.container.container:  {"name": "crm-learning-follow"}
normalize_data.labels.labels:  {"pod-template-hash": "7bc48f8b6b", "app": "crm-learning-follow"}
normalize_data.namespace:  testing1
normalize_data.node.node:  {"name": "tw5"}
normalize_data.pod.pod:  {"name": "crm-learning-follow-7bc48f8b6b-m6kgb"}

场景:部分文本特殊编码转换

在真实的工作环境下,总会遇到一些十六进制字符,需要对其解码才能正常阅读。因此,对于一些十六进制字符进行转义操作可是使用str_hex_escape_encode函数。

原始日志

content : "\xe4\xbd\xa0\xe5\xa5\xbd"

LOG DSL编排

e_set("hex_encode",str_hex_escape_encode(v("content")))

加工后数据

content : "\xe4\xbd\xa0\xe5\xa5\xbd"
hex_encode : "你好"

场景:XML字段展开

测试日志

在工作中也会时不时遇到各种类型数据,比如xml数据。如果要展开xml数据可是使用xml_to_json函数处理。

str : <?xmlversion="1.0"?>
<data>
    <countryname="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighborname="Austria"direction="E"/>
        <neighborname="Switzerland"direction="W"/>
    </country>
    <countryname="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighborname="Malaysia"direction="N"/>
    </country>
    <countryname="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighborname="Costa Rica"direction="W"/>
        <neighborname="Colombia"direction="E"/>
    </country>
</data>

LOG DSL编排

e_set("str_json",xml_to_json(v("str")))

加工后的日志

str : <?xmlversion="1.0"?>
<data>
    <countryname="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighborname="Austria"direction="E"/>
        <neighborname="Switzerland"direction="W"/>
    </country>
    <countryname="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighborname="Malaysia"direction="N"/>
    </country>
    <countryname="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighborname="Costa Rica"direction="W"/>
        <neighborname="Colombia"direction="E"/>
    </country>
</data>
str_dict :{
    "data": {
        "country": [{
            "@name": "Liechtenstein",
            "rank": "1",
            "year": "2008",
            "gdppc": "141100",
            "neighbor": [{
                "@name": "Austria",
                "@direction": "E"
            }, {
                "@name": "Switzerland",
                "@direction": "W"
            }]
        }, {
            "@name": "Singapore",
            "rank": "4",
            "year": "2011",
            "gdppc": "59900",
            "neighbor": {
                "@name": "Malaysia",
                "@direction": "N"
            }
        }, {
            "@name": "Panama",
            "rank": "68",
            "year": "2011",
            "gdppc": "13600",
            "neighbor": [{
                "@name": "Costa Rica",
                "@direction": "W"
            }, {
                "@name": "Colombia",
                "@direction": "E"
            }]
        }]
    }
}

进一步参考

欢迎扫码加入官方钉钉群获得实时更新与阿里云工程师的及时直接的支持:
image

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
3月前
|
SQL 人工智能 监控
SLS Copilot 实践:基于 SLS 灵活构建 LLM 应用的数据基础设施
本文将分享我们在构建 SLS SQL Copilot 过程中的工程实践,展示如何基于阿里云 SLS 打造一套完整的 LLM 应用数据基础设施。
759 58
|
3月前
|
数据采集 运维 监控
不重启、不重写、不停机:SLS 软删除如何实现真正的“无感数据急救”?
SLS 全新推出的「软删除」功能,以接近索引查询的性能,解决了数据应急删除与脏数据治理的痛点。2 分钟掌握这一数据管理神器。
252 32
|
3月前
|
Prometheus 监控 Java
日志收集和Spring 微服务监控的最佳实践
在微服务架构中,日志记录与监控对系统稳定性、问题排查和性能优化至关重要。本文介绍了在 Spring 微服务中实现高效日志记录与监控的最佳实践,涵盖日志级别选择、结构化日志、集中记录、服务ID跟踪、上下文信息添加、日志轮转,以及使用 Spring Boot Actuator、Micrometer、Prometheus、Grafana、ELK 堆栈等工具进行监控与可视化。通过这些方法,可提升系统的可观测性与运维效率。
368 1
日志收集和Spring 微服务监控的最佳实践
|
3月前
|
负载均衡 监控 安全
5 个 IIS 日志记录最佳实践
IIS日志记录是监控Web服务器性能与安全的关键。本文介绍启用日志、应用池配置、负载均衡、敏感数据防护、日志集中管理及保留策略等五大最佳实践,助力高效分析与合规审计。
280 1
|
4月前
|
存储 缓存 Apache
StarRocks+Paimon 落地阿里日志采集:万亿级实时数据秒级查询
A+流量分析平台是阿里集团统一的全域流量数据分析平台,致力于通过埋点、采集、计算构建流量数据闭环,助力业务提升流量转化。面对万亿级日志数据带来的写入与查询挑战,平台采用Flink+Paimon+StarRocks技术方案,实现高吞吐写入与秒级查询,优化存储成本与扩展性,提升日志分析效率。
542 1
|
4月前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL数据库的WAL日志与数据写入的过程
PostgreSQL中的WAL(预写日志)是保证数据完整性的关键技术。在数据修改前,系统会先将日志写入WAL,确保宕机时可通过日志恢复数据。它减少了磁盘I/O,提升了性能,并支持手动切换日志文件。WAL文件默认存储在pg_wal目录下,采用16进制命名规则。此外,PostgreSQL提供pg_waldump工具解析日志内容。
398 0
|
4月前
|
数据采集 运维 监控
|
7月前
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
827 54

相关产品

  • 日志服务