使用Python Log Handler自动上传并解析KV格式的日志

本文涉及的产品
对象存储 OSS,20GB 3个月
阿里云盘企业版 CDE,企业版用户数5人 500GB空间
日志服务 SLS,月写入数据量 50GB 1个月
简介: Python Logging Handler可以无需写代码自动高效上传日志, 还可以像Splunk一样对KV格式自动解析字段. 本文介绍如何简单配置.

概述

使用Python SDK提供的Log Handler可以实现每一条Python程序的日志在不落盘的情况下自动上传到日志服务上。与写到文件再通过各种方式上传比起来,有如下优势:

  1. 实时性:主动直接发送,不落盘
  2. 吞吐量大,异步发送
  3. 配置简单:无需修改程序,无需知道机器位置,修改程序配置文件即可生效
  4. 智能解析: 自动解析日志中JSON和KV格式信息

本篇主要如何打开自动解析KV格式的功能, 关于如何配置并使用的基本信息, 请参考使用Log Handler自动上传Python日志

解决的问题

在程序中, 有时我们需要将特定数据输出到日志中以便跟踪, 例如:

data = {'name':'xiao ming', 'score': 100.0}

一般情况下, 我们会格式化数据内容, 附加其他信息并输出:

data = {'name':'xiao ming', 'score': 100.0}
logger.error('get some error when parsing data. name="{}" score={}'.format(data['name'], data['score']))

这样会输出的消息为:

get some error when parsing data. name="xiao ming" score=100.0

我们期望在上传到日志服务时可以自动解析出域namescore字段. 使用Python Handler的简单配置即可做到. 如下.

通过Logging的配置文件

参考Logging Handler的详细配置, 将其中参数列表修改为:

args=(os.environ.get('ALIYUN_LOG_SAMPLE_ENDPOINT', ''), os.environ.get('ALIYUN_LOG_SAMPLE_ACCESSID', ''), os.environ.get('ALIYUN_LOG_SAMPLE_ACCESSKEY', ''), os.environ.get('ALIYUN_LOG_SAMPLE_TMP_PROJECT', ''), "logstore", None, None, None, None, None, None, None, None, None, None, None, None, True)

最后一个参数对应了Logging Handler的详细参数extract_kv参数.

注意, 受限于Python Logging的限制, 这里只能用无名参数, 依次传入. 对于不改的参数, 用None占位.

通过代码以JSON形式配置

如果期望更加灵活的配置, 也可以使用代码配置, 如下将参数extract_kv设置为True即可.

#encoding: utf8
import logging, logging.config, os

# 配置
conf = {'version': 1,
        'formatters': {'rawformatter': {'class': 'logging.Formatter',
                                        'format': '%(message)s'}
                       },
        'handlers': {'sls_handler': {'()':
                                     'aliyun.log.QueuedLogHandler',
                                     'level': 'INFO',
                                     'formatter': 'rawformatter',

                                     # custom args:
                                     'end_point': os.environ.get('ALIYUN_LOG_SAMPLE_ENDPOINT', ''),
                                     'access_key_id': os.environ.get('ALIYUN_LOG_SAMPLE_ACCESSID', ''),
                                     'access_key': os.environ.get('ALIYUN_LOG_SAMPLE_ACCESSKEY', ''),
                                     'project': 'project1',
                                     'log_store': "logstore1",
                                     'extract_kv': True
                                     }
                     },
        'loggers': {'sls': {'handlers': ['sls_handler', ],
                                   'level': 'INFO',
                                   'propagate': False}
                    }
        }
logging.config.dictConfig(conf)

# 使用
logger = logging.getLogger('sls')
logger.error("get error, reason=103 return_code=333 agent_type=ios")

支持KV的格式

默认支持key=value的格式, 也就是等号=分隔的值. 其中关键字key的范围是: 中日文, 字母数字, 下划线, 点和横线. 值value在有双引号括起来的情况下是除了双引号的任意字符. 在没有双引号括起来的情况下和关键字是一样的. 如下都是支持的:

c1 = "i=c1, k1=v1,k2=v2 k3=v3"
c2 = 'i=c2, k1=" v 1 ", k2="v 2" k3="~!@#=`;.>"'  # 双引号
c3 = 'i=c3, k1=你好 k2=他们'       # utf8
c4 = u'i=c4, 姓名=小明 年龄=中文 '   # utf8
c5 = u'i=c5, 姓名="小明" 年龄="中文"'# utf8
c6 = u'i=c6, 姓名=中文 年龄=中文'    # unicode
c7 = u'i=c7, 姓名="小明" 年龄=中文 ' # unicode
c8 = """i=c8, k1="hello           # 换行
world" k2="good
morning"
"""

自定义分隔符

默认通过等号=分隔, 也可以通过参数extract_kv_sep修改, 例如冒号:

c9 = 'k1:v1 k2:v2'

有时我们的分隔符是混合的, 有时为=有时为:, 如下:

c10 = 'k1=v1 k2:v2'
c11 = "k3 = v3"
c12 = "k4 : v4"

可以传入一个正则表达式给参数extract_kv_sep即可, 例如上面的情况可以传入(?:=|:), 这里使用可非捕获分组(?:), 再用|将各种可能的分隔符写入即可.

域名冲突

当关键字和内置日志域冲突时, 需要做一些调整, 例如:

c1 = 'student="xiao ming" level=3'

这里的level和日志域的内建表示日志级别冲突了, 可以通过参数buildin_fields_prefix / buildin_fields_suffix给系统日志域添加前缀后缀;
或者通过参数extract_kv_prefixextract_kv_suffix给抽取的域添加前缀后缀来解决.

其他定制参数

自动抽取KV也支持更多其他相关参数如下:

参数 作用 默认值
extract_kv 是否自动解析KV False
extract_kv_drop_message 匹配KV后是否丢弃掉默认的message域 False
extract_kv_prefix 给解析的域添加前缀 空串
extract_kv_suffix 给解析的域添加后缀 空串
extract_kv_sep 关键字和值的分隔符 =
buildin_fields_prefix 给系统域添加前缀 空串
buildin_fields_suffix 给系统域添加后缀 空串

进一步参考

  • 扫码加入官方钉钉群 (11775223):
    image
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
16天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
135 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
14天前
|
算法 Python
Python 大神修炼手册:图的深度优先&广度优先遍历,深入骨髓的解析
在 Python 编程中,掌握图的深度优先遍历(DFS)和广度优先遍历(BFS)是进阶的关键。这两种算法不仅理论重要,还能解决实际问题。本文介绍了图的基本概念、邻接表表示方法,并给出了 DFS 和 BFS 的 Python 实现代码示例,帮助读者深入理解并应用这些算法。
28 2
|
23天前
|
测试技术 开发者 Python
深入浅出:Python中的装饰器解析与应用###
【10月更文挑战第22天】 本文将带你走进Python装饰器的世界,揭示其背后的魔法。我们将一起探索装饰器的定义、工作原理、常见用法以及如何自定义装饰器,让你的代码更加简洁高效。无论你是Python新手还是有一定经验的开发者,相信这篇文章都能为你带来新的启发和收获。 ###
13 1
|
23天前
|
设计模式 测试技术 开发者
Python中的装饰器深度解析
【10月更文挑战第24天】在Python的世界中,装饰器是那些能够为函数或类“添彩”的魔法工具。本文将带你深入理解装饰器的概念、工作原理以及如何自定义装饰器,让你的代码更加优雅和高效。
|
29天前
|
Python
python读写操作excel日志
主要是读写操作,创建表格
56 2
|
28天前
|
Python Windows
python知识点100篇系列(24)- 简单强大的日志记录器loguru
【10月更文挑战第11天】Loguru 是一个功能强大的日志记录库,支持日志滚动、压缩、定时删除、高亮和告警等功能。安装简单,使用方便,可通过 `pip install loguru` 快速安装。支持将日志输出到终端或文件,并提供丰富的配置选项,如按时间或大小滚动日志、压缩日志文件等。还支持与邮件通知模块结合,实现邮件告警功能。
python知识点100篇系列(24)- 简单强大的日志记录器loguru
|
1月前
|
XML 前端开发 数据格式
Beautiful Soup 解析html | python小知识
在数据驱动的时代,网页数据是非常宝贵的资源。很多时候我们需要从网页上提取数据,进行分析和处理。Beautiful Soup 是一个非常流行的 Python 库,可以帮助我们轻松地解析和提取网页中的数据。本文将详细介绍 Beautiful Soup 的基础知识和常用操作,帮助初学者快速入门和精通这一强大的工具。【10月更文挑战第11天】
60 2
|
1月前
|
数据安全/隐私保护 流计算 开发者
python知识点100篇系列(18)-解析m3u8文件的下载视频
【10月更文挑战第6天】m3u8是苹果公司推出的一种视频播放标准,采用UTF-8编码,主要用于记录视频的网络地址。HLS(Http Live Streaming)是苹果公司提出的一种基于HTTP的流媒体传输协议,通过m3u8索引文件按序访问ts文件,实现音视频播放。本文介绍了如何通过浏览器找到m3u8文件,解析m3u8文件获取ts文件地址,下载ts文件并解密(如有必要),最后使用ffmpeg合并ts文件为mp4文件。
|
1月前
|
Web App开发 SQL 数据库
使用 Python 解析火狐浏览器的 SQLite3 数据库
本文介绍如何使用 Python 解析火狐浏览器的 SQLite3 数据库,包括书签、历史记录和下载记录等。通过安装 Python 和 SQLite3,定位火狐数据库文件路径,编写 Python 脚本连接数据库并执行 SQL 查询,最终输出最近访问的网站历史记录。
|
1月前
|
机器学习/深度学习 算法 Python
深度解析机器学习中过拟合与欠拟合现象:理解模型偏差背后的原因及其解决方案,附带Python示例代码助你轻松掌握平衡技巧
【10月更文挑战第10天】机器学习模型旨在从数据中学习规律并预测新数据。训练过程中常遇过拟合和欠拟合问题。过拟合指模型在训练集上表现优异但泛化能力差,欠拟合则指模型未能充分学习数据规律,两者均影响模型效果。解决方法包括正则化、增加训练数据和特征选择等。示例代码展示了如何使用Python和Scikit-learn进行线性回归建模,并观察不同情况下的表现。
296 3

相关产品

  • 日志服务
  • 推荐镜像

    更多
    下一篇
    无影云桌面