阿里云日志服务SLS Python SDK实战——日志采集、查询与分析

简介: 本文详解如何用Python SDK快速接入阿里云日志服务(SLS),涵盖项目/Logstore创建、凭证配置、日志采集(INFO/ERROR等)、关键词查询与SQL分析(如按级别统计),附完整可运行代码。助力开发者低成本、高效率构建日志监控与分析体系。(239字)

阿里云日志服务(SLS)是一种一站式日志管理服务,提供日志采集、存储、查询、分析、告警等全流程功能,广泛应用于应用日志监控、运维排查、业务数据分析等场景。相较于传统的日志文件存储,SLS具备弹性扩容、低成本、快速查询等优势,能够轻松应对海量日志数据的处理需求。本文将使用Python SDK实现SLS的日志采集、查询、分析等核心操作,附上完整代码示例,帮助开发者快速搭建日志管理体系。
首先完成开发准备:1. 在阿里云控制台创建SLS Project和Logstore,Project是SLS的资源管理单元,Logstore用于存储具体的日志数据;2. 获取SLS的访问凭证(AccessKey ID、AccessKey Secret)以及Project的Endpoint;3. 在Python环境中安装SLS SDK,通过pip命令安装:pip install aliyun-log-python-sdk。
首先实现日志采集功能,SLS支持通过SDK直接上传日志数据,适用于应用程序主动上报日志的场景。本次实战将模拟一个Python应用,采集应用运行日志(如INFO、ERROR级别日志),并上传到SLS Logstore。以下是日志采集的核心代码:
import logging
from aliyun.log import LogClient, PutLogsRequest, LogItem
import time
import random

配置SLS凭证与资源信息

SLS_CONFIG = {
"access_key_id": "your_access_key_id", # 替换为你的AccessKey ID
"access_key_secret": "your_access_key_secret", # 替换为你的AccessKey Secret
"endpoint": "cn-hangzhou.log.aliyuncs.com", # 替换为你的Project Endpoint
"project": "your-project-name", # 替换为你的SLS Project名称
"logstore": "your-logstore-name" # 替换为你的Logstore名称
}

初始化SLS客户端

client = LogClient(SLS_CONFIG["endpoint"], SLS_CONFIG["access_key_id"], SLS_CONFIG["access_key_secret"])

def init_logger():
"""初始化本地日志记录器(可选)"""
logger = logging.getLogger("sls_demo")
logger.setLevel(logging.DEBUG)

# 创建控制台处理器
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
return logger

def upload_logs_to_sls(log_level, message, logger=None):
"""
上传日志到SLS
:param log_level: 日志级别(INFO/ERROR/WARN/DEBUG)
:param message: 日志内容
:param logger: 本地日志记录器
"""
try:

    # 构造日志条目
    log_item = LogItem()
    log_time = int(time.time())  # 日志时间戳(秒级)
    log_item.set_time(log_time)
    # 设置日志内容(键值对形式)
    log_item.set_contents({
        "log_level": log_level,
        "message": message,
        "app_name": "python-sls-demo",
        "host_ip": "127.0.0.1",  # 模拟主机IP
        "request_id": f"req-{random.randint(10000, 99999)}"  # 模拟请求ID
    })
    # 构造批量上传请求
    request = PutLogsRequest(
        project=SLS_CONFIG["project"],
        logstore=SLS_CONFIG["logstore"],
        log_items=[log_item],
        topic="python-app-log",  # 日志主题,用于分类管理
        source="python-script"  # 日志来源
    )
    # 执行日志上传
    response = client.put_logs(request)
    if response.is_success():
        if logger:
            logger.info(f"日志上传成功,请求ID:{response.get_request_id()}")
        return True
    else:
        err_msg = f"日志上传失败,错误码:{response.get_error_code()},错误信息:{response.get_error_message()}"
        if logger:
            logger.error(err_msg)
        return False
except Exception as e:
    err_msg = f"日志上传异常:{str(e)}"
    if logger:
        logger.error(err_msg)
    return False

模拟应用运行,上传日志

if name == "main":
local_logger = init_logger()

# 模拟上传不同级别的日志
upload_logs_to_sls("INFO", "应用启动成功,开始处理业务请求", local_logger)
upload_logs_to_sls("DEBUG", "用户登录请求,用户名:zhangsan", local_logger)
# 模拟异常日志
try:
    1 / 0
except ZeroDivisionError as e:
    upload_logs_to_sls("ERROR", f"业务处理异常:{str(e)},异常位置:demo.py:50", local_logger)
upload_logs_to_sls("WARN", "数据库连接池连接数即将达到上限,当前连接数:8/10", local_logger)
upload_logs_to_sls("INFO", "应用处理完所有请求,正常退出", local_logger)

日志上传完成后,需要实现日志查询与分析功能。SLS支持通过SDK执行日志查询,支持关键词查询、时间范围查询、字段过滤等,同时支持SQL分析,能够对日志数据进行统计、聚合等操作。以下是日志查询与SQL分析的代码示例:
from aliyun.log import GetLogsRequest, GetLogStoreLogsRequest, SqlQueryRequest
import time

初始化SLS客户端(同日志采集)

client = LogClient(SLS_CONFIG["endpoint"], SLS_CONFIG["access_key_id"], SLS_CONFIG["access_key_secret"])

def query_logs_by_keyword(keyword, start_time, end_time):
"""
根据关键词查询日志
:param keyword: 查询关键词
:param start_time: 开始时间(Unix时间戳,秒级)
:param end_time: 结束时间(Unix时间戳,秒级)
:return: 日志列表
"""
try:

    # 构造日志查询请求
    request = GetLogsRequest(
        project=SLS_CONFIG["project"],
        logstore=SLS_CONFIG["logstore"],
        from_time=start_time,
        to_time=end_time,
        query=keyword,  # 查询关键词
        line=100,  # 最多返回100条日志
        offset=0  # 查询偏移量
    )
    # 执行查询
    response = client.get_logs(request)
    if response.is_success():
        logs = response.get_logs()
        print(f"查询到日志数量:{len(logs)}")
        return logs
    else:
        print(f"日志查询失败,错误码:{response.get_error_code()},错误信息:{response.get_error_message()}")
        return []
except Exception as e:
    print(f"日志查询异常:{str(e)}")
    return []

def sql_analysis_logs(sql_statement, start_time, end_time):
"""
使用SQL分析日志数据
:param sql_statement: SQL分析语句
:param start_time: 开始时间(Unix时间戳,秒级)
:param end_time: 结束时间(Unix时间戳,秒级)
:return: 分析结果
"""
try:

    # 构造SQL分析请求
    request = SqlQueryRequest(
        project=SLS_CONFIG["project"],
        logstore=SLS_CONFIG["logstore"],
        sql=sql_statement,
        from_time=start_time,
        to_time=end_time
    )
    # 执行SQL分析
    response = client.sql_query(request)
    if response.is_success():
        analysis_result = response.get_results()
        print("SQL分析结果:")
        for row in analysis_result:
            print(row)
        return analysis_result
    else:
        print(f"SQL分析失败,错误码:{response.get_error_code()},错误信息:{response.get_error_message()}")
        return []
except Exception as e:
    print(f"SQL分析异常:{str(e)}")
    return []

测试日志查询与分析

if name == "main":

# 定义查询时间范围(近1小时)
end_time = int(time.time())
start_time = end_time - 3600
# 1. 根据关键词查询ERROR级别日志
error_logs = query_logs_by_keyword("ERROR", start_time, end_time)
for log in error_logs[:5]:  # 打印前5条ERROR日志
    print(f"日志时间:{log.get_time()},日志内容:{log.get_contents()}")
# 2. 使用SQL分析不同日志级别的数量
sql = """
SELECT log_level, COUNT(*) AS log_count 
FROM log 
GROUP BY log_level 
ORDER BY log_count DESC;
"""
sql_analysis_logs(sql, start_time, end_time)
# 3. 分析不同应用的日志数量
sql2 = """
SELECT app_name, COUNT(*) AS app_log_count 
FROM log 
WHERE log_level = 'INFO' 
GROUP BY app_name;
"""
sql_analysis_logs(sql2, start_time, end_time)

在实际开发中,还可以对日志采集与分析功能进行优化:1. 实现日志批量上传,减少API调用次数,提升采集效率;2. 配置SLS的自动采集规则,通过Logtail采集服务器日志、应用日志,无需手动调用SDK上传;3. 结合SLS的告警功能,设置日志告警规则(如ERROR日志数量超过阈值时触发告警),及时发现问题;4. 使用SLS的可视化功能,创建日志仪表盘,实时监控日志数据;5. 配置日志生命周期管理,自动清理过期日志,降低存储成本。
需要注意的是,SLS的查询与分析性能与日志索引配置相关,建议为常用的查询字段(如log_level、app_name、request_id)创建索引,提升查询速度。同时,为了保证日志数据的安全性,建议通过RAM子账号配置SLS的访问权限,限制子账号的操作范围(如仅允许上传日志、查询日志,禁止删除Logstore)。
通过本文的实战代码,开发者可以快速实现日志数据的采集、查询与分析,依托阿里云SLS构建完善的日志管理体系。SLS能够轻松应对海量日志数据的处理需求,帮助开发者快速排查应用问题、分析业务数据,提升运维效率与业务决策能力。后续可结合阿里云其他产品(如函数计算、云监控),构建自动化的日志监控与运维体系。

阿里云SLS #日志服务 #Python SDK #日志采集 #SQL分析

目录
相关文章
|
11天前
|
人工智能 JSON 自然语言处理
让教学更智慧:用阿里云百炼工作流,自动生成中小学教材内容#小有可为#有温度的AI
通过可视化工作流编排,将大模型推理能力转化为标准化的教学内容生成引擎。教师只需输入教材标题和适用学段,即可自动获得结构完整、符合课程标准的章节内容,大幅降低备课门槛,助力教育资源均衡化。
493 126
|
21天前
|
Linux 程序员 数据格式
【2026最新】Notepad++下载、安装和使用一篇搞定(附中文版安装包)
Notepad++ 是一款免费开源、轻量高效的 Windows 文本编辑器,支持 C/Python/HTML 等 80+ 语言语法高亮、代码折叠、正则替换、编码转换及插件扩展,专为程序员与文本处理用户打造,完美替代系统记事本。(239字)
|
6天前
|
人工智能 缓存 安全
Claude Code 封号真实原因曝光,这次彻底不装了,直接针对国内开发者的账号下手?
Claude Code 封号潮背后:逆向扒出客户端隐写区域标记,Anthropic 政策收紧叠加 DeepSeek 7 月涨价,国产替代更紧迫。
|
15天前
|
存储 人工智能 监控
QoderWork完全指南:从入门到精通,把“AI实习生”变成你的全能工作搭档
阿里云2026年推出的桌面端AI工作助手QoderWork,不止聊天,更可动手干活:本地运行、安全可控,支持文件整理、数据分析、PPT生成、网页开发等;内置专家套件、多Agent协作与自定义Skills,让AI真正成为你身边的“AI实习生”。
|
7天前
|
人工智能 安全 程序员
终于,Claude Code 封号的原因被曝光了!竟然针对中国用户,植入隐形代码?!
通俗易懂地揭秘 Claude Code 封号的手段,分享一些自己对 AI 编程困境的思考,Codex、Cursor、DeepSeek、智谱 GLM、甚至是豆包,都有所行动了
403 1
|
7天前
|
人工智能 安全 Cloud Native
Higress 新发布:AI Gateway 能力增强,Gateway API 及其推理扩展持续打磨
增强 AI 网关能力,持续打磨 Gateway API 及其推理扩展。
361 126
|
16天前
|
机器学习/深度学习 人工智能 调度
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~
HappyHorse 1.1 是新一代视频生成大模型,全面升级动态表现力、角色一致性、指令遵循、视觉质感与音画协同能力。支持I2V/T2V/R2V三类生成,适配短剧、电商广告、品牌营销等场景,提供高质、流畅、可控的AI视频生产力。
908 5
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~