阿里云日志服务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分析

目录
相关文章
|
资源调度 分布式计算 安全
伏羲—阿里云分布式调度系统
在12月12日的云栖社区在线培训上,“飞天”分布式系统核心开发人员陶阳宇分享了《伏羲-阿里云分布式调度系统》。他主要从伏羲系统架构、任务调度、资源调度、容错机制、规模挑战、安全与性能隔离方面介绍了伏羲分布式系统架构和设计理念。
24174 0
|
人工智能 数据可视化 安全
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
本文详解如何用阿里云Lighthouse一键部署OpenClaw,结合飞书CLI等工具,让AI真正“动手”——自动群发、生成科研日报、整理知识库。核心理念:未来软件应为AI而生,CLI即AI的“手脚”,实现高效、安全、可控的智能自动化。
35349 57
|
7月前
|
人工智能 搜索推荐 持续交付
阿里云GPU服务器租用价格表2026年最新:L20/A10/V100/T4/P100/P4 GPU卡支持
阿里云2026年最新GPU服务器(现称EGS弹性GPU服务)支持L20、A10、V100等多款GPU卡,覆盖AI推理、图形渲染、科学计算等场景。提供按量、包月、包年多种计费,gn8is(L20)等实例月付低至6919元起,支持1小时起租与机密计算。(239字)
7044 9
|
3月前
|
存储 机器学习/深度学习 人工智能
深度解析 Hermes Agent 如何实现“自进化”及其 Prompt / Context / Harness 的设计实践
本文是「项目深度解析」系列的第3篇,也欢迎阅读:《深度解析OpenClaw》《深度解析Claude Code》。(文章内容基于作者个人技术实践与独立思考,旨在分享经验,仅代表个人观点。)
深度解析 Hermes Agent 如何实现“自进化”及其 Prompt / Context / Harness 的设计实践
|
3月前
|
人工智能
GEO已经完蛋了?
DeepSeek R1 升级重击劣质GEO:百万级上下文+信源ABC分级,让水文、伪背书、关键词堆砌彻底失效。GEO未死,只是回归本质——用真实问题、可信信源、扎实内容赢得AI信任。正向GEO,才是AI时代的长期主义。(239字)
|
人工智能 Apache 流计算
FFA 2025 新加坡站全议程上线|The Future of AI is Real-Time
Flink Forward Asia 2025将于7月3日在新加坡举办,主题为“实时智能的未来”。大会聚焦实时AI、实时湖仓与实时分析,展示Apache Flink及社区项目如Paimon、Fluss的最新成果。来自阿里云、AWS、TikTok等企业专家将分享洞见,现场及直播观众均可参与互动抽奖,共襄技术盛宴。
837 14
FFA 2025 新加坡站全议程上线|The Future of AI is Real-Time
|
人工智能
上车吧,1000+claw概念域名来袭!
风口真正值钱的,从来不是最热闹的那一天,而是热闹之后,产品开始成片长出来的那一刻…
|
人工智能 JavaScript 前端开发
分享开源库:AI驱动的JavaScript反编译,针对混淆和压缩的代码
这是一个智能JavaScript反混淆与代码分析工具,通过AST转换和AI深度分析,自动还原变量名、识别依赖库、生成可视化控制流图,并支持多格式导出,提升代码理解与审计效率。访问 [jsunpack.tech](https://www.jsunpack.tech/) 即可在线体验。
2624 0

热门文章

最新文章