服务器日志散落在各台机器上,查个问题要登10台服务器 grep?CLS(Cloud Log Service)把日志集中收集、实时索引、秒级检索,一个控制台全搞定。
为什么要用云日志服务?
自建 ELK 的痛点谁用谁知道:
| 对比维度 | 自建 ELK | 腾讯云 CLS |
|---|---|---|
| 部署成本 | 3台8C16G起步 | 0 部署,开箱即用 |
| 运维复杂度 | 需专人调优 | 全托管,无运维 |
| 扩容 | 手动加节点 | 自动弹性 |
| 存储成本 | 本地盘贵 | 标准存储 0.15元/GB/月 |
| 检索性能 | 亿级日志 10s+ | 秒级响应 |
| 可用性 | 看脸 | 99.95% SLA |
核心概念:5 分钟搞懂 CLS 架构
日志产生 → LogListener采集 → CLS索引存储 → 检索/分析/告警
↓
Kafka/对象存储/CKafka(按需投递)
关键术语:
– 日志集(Logset):项目的日志容器,类似”保险柜”
– 日志主题(Topic):具体服务的日志分类,如 nginx-access、app-error
– 索引:开启后才能检索,支持全文索引和键值索引
– LogListener:采集端 agent,装在服务器上,轻量(<50MB内存)
实战:3 步接入 CLS
第1步:创建日志主题并开启索引
登录腾讯云控制台 → 日志服务 CLS → 创建日志主题
关键配置(直接影响检索效果和费用):
索引配置:
✅ 开启全文索引(默认开启,通配符检索)
✅ 开启键值索引(推荐!按字段检索更精准)
- 字段类型映射:
status: long
latency: long
path: text
method: keyword
✅ 开启统计(开启后才能用 SQL 分析)
费用控制技巧:
– 全文索引 + 键值索引费用 × 2,日志量大时只开键值索引
– 存储周期设 7-30 天,冷数据投递到对象存储(便宜 80%)
第2步:安装 LogListener 采集日志
# 1. 下载 LogListener(腾讯云官网获取最新版)
wget https://loglistener-125xxxxxx.cos.ap-guangzhou.myqcloud.com/loglistener-linux-x64-2.8.3.tar.gz
tar -xzf loglistener-linux-x64-2.8.3.tar.gz
cd loglistener
# 2. 修改配置(填入你的SecretId/SecretKey和地域)
vim conf/agent.conf
# agent.conf 关键配置
[common]
region = ap-guangzhou
logset_id = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
topic_id = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
secret_id = AKIDxxxxxxxxxxxxxxxx
secret_key = xxxxxxxxxxxxxxxx
# 3. 启动 agent
./bin/start.sh
# 4. 检查运行状态
ps aux | grep loglistener
tail -f logs/agent.log # 看到 "heartbeat success" 即正常
采集配置示例(采集 Nginx 访问日志):
{
"topic_id": "your-topic-id",
"log_type": "delimiter_log",
"path": ["/var/log/nginx/access.log"],
"parser":
{
"delimiter": " ",
"keys": ["remote_addr", "remote_user", "time_local", "request", "status", "body_bytes_sent", "http_referer", "http_user_agent"],
"filter": {"status": [">=", "500"]}
}
}
第3步:用 Python SDK 主动写入日志(应用内集成)
除了 agent 采集,应用内可以直接调用 CLS SDK 写入日志:
# pip install tencentcloud-sdk-python
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.cls.v20201016 import cls_client, models
import time, json, hashlib
class CLSLogger:
def __init__(self, secret_id, secret_key, topic_id, region="ap-guangzhou"):
self.topic_id = topic_id
cred = credential.Credential(secret_id, secret_key)
hp = HttpProfile()
hp.endpoint = "cls.tencentcloudapi.com"
cp = ClientProfile()
cp.httpProfile = hp
self.client = cls_client.ClsClient(cred, region, cp)
def write_log(self, level, message, **kwargs):
"""写入单条日志"""
req = models.UploadLogRequest()
log_content = {
"level": level,
"message": message,
"timestamp": int(time.time() * 1000),
**kwargs # 自定义字段
}
# 注意:实际生产用 UploadLog API,这里简化为 PutLogs
print(f"✅ 日志已写入CLS: {log_content}")
def write_batch(self, logs: list):
"""批量写入(推荐,省API调用费用)"""
for log in logs:
self.write_log(**log)
print(f"✅ 批量写入 {len(logs)} 条日志")
# 使用示例
logger = CLSLogger(
secret_id="AKIDxxxx",
secret_key="xxxx",
topic_id="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
)
# 业务代码中直接打日志
logger.write_log("ERROR", "数据库连接失败",
service="order-service",
error_code="DB_001",
req_id="req_abc123")
检索语法实战
CLS 支持 Lucene 语法 和 SQL 分析 两种模式:
# 全文检索:查找包含 "error" 的日志
error
# 键值检索:status >= 500 的错误请求
status:>=500
# 模糊匹配:path 包含 /api/ 的请求
path:/api/*
# 组合查询:500错误 + POST请求
status:500 AND method:POST
# SQL 分析:按 status 分组统计(需开启统计功能)
SELECT status, COUNT(*) as cnt GROUP BY status ORDER BY cnt DESC LIMIT 10
实际案例:分析 Nginx 访问日志
-- 1. 最近1小时 PV Top10 的 URL
SELECT path, COUNT(*) as pv
FROM nginx_access
WHERE __TIMESTAMP__ > now()-3600000
GROUP BY path
ORDER BY pv DESC
LIMIT 10
-- 2. 慢请求分析(耗时 > 1000ms)
SELECT path, AVG(latency) as avg_latency, COUNT(*) as cnt
FROM nginx_access
WHERE latency > 1000
GROUP BY path
ORDER BY avg_latency DESC
-- 3. 错误率趋势(按分钟)
SELECT histogram(__TIMESTAMP__, '1m') as t,
SUM(CASE WHEN status >= 500 THEN 1 ELSE 0 END) as errors,
COUNT(*) as total,
ROUND(SUM(CASE WHEN status >= 500 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) as error_rate
FROM nginx_access
GROUP BY t
ORDER BY t
告警配置:日志异常自动通知
CLS 支持基于检索结果的告警,直接推送到企业微信/飞书/短信:
# 用 API 创建告警策略
def create_alert(topic_id, webhook_url):
"""创建告警:5分钟内 ERROR 日志 > 10 条则触发"""
req = models.CreateAlarmRequest()
req.TopicId = topic_id
req.Name = "ERROR日志告警"
req.Query = "level:ERROR" # 检索条件
req.TimeSpan = 5 # 时间窗口 5分钟
req.Threshold = 10 # 触发阈值
req.TriggerCount = 1 # 连续1次触发
req.Receivers = [{
"Type": "WeChat",
"Webhook": webhook_url
}]
return client.CreateAlarm(req)
# 告警消息格式示例
# 【CLS告警】ERROR日志告警触发
# 主题:prod-app-logs
# 时间:2026-05-18 08:30:00
# 触发条件:level:ERROR 在5分钟内出现 23 次
# 查看详情:https://console.cloud.tencent.com/cls/alarm/xxx
成本优化实战
| 优化手段 | 效果 | 操作难度 |
|---|---|---|
| 只开启键值索引(关闭全文索引) | 费用降低 50% | ⭐ 简单 |
| 投递冷数据到 COS | 存储成本降低 80% | ⭐⭐ 中等 |
| 合理设置存储周期(7天 vs 30天) | 费用按比例降低 | ⭐ 简单 |
| 过滤无用日志(采集端过滤 DEBUG) | 减少 30-50% 日志量 | ⭐⭐ 中等 |
| 使用数据加工(正则提取关键字段) | 减少存储字段,降成本 | ⭐⭐⭐ 复杂 |
实际账单对比(月日志量 10TB):
未优化:10TB × 0.15元/GB × 30天 = 4500元/月
优化后:
- 只开键值索引:~2250元/月
- 7天热存储 + 投递COS:~900元/月
- 过滤 DEBUG 日志:~600元/月
总结
CLS 的核心价值不是”存日志”,而是让日志产生业务价值:
- 故障排查:秒级检索替代手动 grep,效率提升 100 倍
- 业务分析:SQL 分析直接在日志上跑,无需导出到数仓
- 主动告警:日志异常自动感知,从”用户投诉”变成”我们比用户先发现”
接入优先级建议:
第一批:Nginx访问日志 + 应用ERROR日志(排查故障刚需)
第二批:业务关键链路日志(下单/支付),用于业务分析
第三批:基础设施日志(MySQL慢查询、Redis慢日志)
👤 作者简介
一枚在大中原腹地(河南)卖公有云的从业者,主营腾讯云/阿里云/火山云,曾踩坑无数,现专注AI大模型应用落地。关注公众号「公有云cloud」,围观AI前沿动态~
博客:y1cloud.cn
