乐于分享
好东西不私藏

从定位到修复: OpenClaw 自动化修复完整闭环

从定位到修复: OpenClaw 自动化修复完整闭环

找到问题只是开始,能自动修复才是终局。

上一篇我讲了如何用 OpenClaw 做日志根因分析,把翻日志时间从 2 小时压缩到 5 分钟。

很多人在问:"既然能定位问题,能不能直接修复?"

答案是:能,但不是无脑自动修复。

今天这篇文章,我只讲一件事:

如何用 OpenClaw 把"定位问题"和"修复问题"串成一个完整闭环。

我会讲清楚:

为什么自动修复比自动定位难 10 倍如何设计一个"可控"的自动修复系统OpenClaw 如何串联诊断→决策→执行→验证的完整流程7 天落地全流程(有完整代码)

这不是理论,是我在生产环境跑了 3 个月的实战经验。


一、为什么自动修复这么难

先说结论:自动修复的难度不在技术,在风险控制。

定位问题 vs 修复问题

定位问题:

风险: 低(只读操作)容错: 高(判断错了重新分析)影响范围: 无(不改变系统状态)可回退: 不需要回退

修复问题:

风险: 高(写操作,可能搞出更大的事故)容错: 低(修复错了可能雪上加霜)影响范围: 可能是全局的可回退: 必须支持,且可能很难

举个例子:

你的数据库连接池满了,AI 判断出根因是"慢查询导致连接堆积"。

如果 AI 建议你:

A方案: 重启服务(简单但可能丢失请求)B方案: kill 慢查询(精准但可能影响业务)C方案: 扩容连接池(安全但治标不治本)

你选哪个?

如果是凌晨 3 点,业务影响严重,你可能选 A如果是工作时间,你可能选 B如果有时间,你可能选 C + 排查慢查询

所以自动修复的核心问题不是"能不能修",而是:

1. 在什么条件下修?2. 用什么策略修?3. 修完怎么验证?4. 修错了怎么回退?


二、我的设计原则

在做自动修复之前,我给自己定了 5 条铁律:

原则1: 人机协同,不是完全自动

AI 提建议,人做决策,高可信场景才自动执行。

三个级别:

L1 - 通知模式: AI 只发通知,不做任何操作(适合复杂故障)L2 - 建议模式: AI 给出修复方案,等人确认后执行(适合中等风险)L3 - 自动模式: AI 直接执行,事后通知(仅限低风险场景)

示例:

L1: 数据库主从切换 → 通知模式(风险极高)L2: 重启某个 Pod → 建议模式(中等风险)L3: 清理临时文件 → 自动模式(低风险)

原则2: 白名单机制,永不越权

只修复预定义的、经过验证的场景,不做任何即兴发挥。

维护一个"可自动修复场景白名单":

allowed_fixes:  - type: pod_restart    conditions:      - status: CrashLoopBackOff      - restart_count: < 5      - namespace: !~ production-critical    approval: auto  - type: disk_cleanup    conditions:      - disk_usage: > 90%      - path: /tmp    approval: auto  - type: connection_pool_reset    conditions:      - pool_usage: 100%      - service: checkout-api    approval: manual  # 需要人工确认

不在白名单里的,一律走人工审批。

原则3: 可观测、可回退、可审计

每一步操作都有日志,每一次修复都能回退,每一个决策都有审计。

必须记录:

修复触发时间问题诊断结果选择的修复策略执行前的系统快照执行过程的详细日志执行后的验证结果修复效果评估

必须支持回退:

重启服务 → 保留旧版本镜像修改配置 → 自动备份旧配置扩容资源 → 支持一键缩容

原则4: 验证闭环,修完必须验证

修复不是目的,恢复服务才是。

验证机制:

1.健康检查(HTTP 200?)2.关键指标恢复(错误率下降?)3.业务功能验证(下单成功?)4.持续观察(10 分钟内稳定?)

如果验证失败,立即回退。

原则5: 从小范围试点开始

不要一上来就在生产环境全量自动修复。

灰度策略:

1.测试环境跑 2 周2.生产环境选 1-2 个低风险服务试点3.只允许 L3(自动模式)处理最低风险的场景4.观察 1 个月,无事故后逐步扩大范围

三、OpenClaw 如何串联整个闭环

核心思路:OpenClaw 既是"大脑"也是"双手"。

OpenClaw 的 Skill 系统天然支持:

读操作: 查询日志、读取指标、获取系统状态写操作: 执行脚本、调用 API、修改配置

所以不需要额外工具,OpenClaw 自己就能完成从诊断到修复的完整闭环:

OpenClaw完整闭环触发(AlertmanagerWebhook)诊断(VictoriaLogs根因分析Skill)决策(修复策略匹配Skill)执行(Kubernetes/Ansible/ScriptSkill)验证(健康检查Skill)通知(Slack/企业微信)

OpenClaw Skill 的执行能力:

# OpenClaw 可以直接调用的工具- kubectl (Kubernetes操作)- ansible-playbook (配置管理)- curl/http (API 调用)- shell script (自定义脚本)- python script (复杂逻辑)- cloud CLI (AWS/GCP/阿里云/腾讯云)

关键设计:

Skill 之间可组合 - 根因分析 Skill → 修复执行 Skill → 验证 SkillSkill 有上下文传递 - 前一个 Skill 的输出是后一个 Skill 的输入Skill 有权限控制 - 通过白名单机制限制操作范围

四、7 天搭建完整闭环

Day 1-2: 创建 Kubernetes 操作 Skill (6小时)

目标: 让 OpenClaw 能执行 Kubernetes 基础操作。

步骤1: 创建 K8s 操作 Skill

# skills/k8s-operator/SKILL.md## Kubernetes 操作 Skill### 功能执行Kubernetes基础运维操作(重启Pod、扩缩容、查看状态)### 操作白名单- restart_pod:重启指定Pod- scale_deployment:调整副本数- get_pod_status:查看Pod状态- get_pod_logs:获取Pod日志### 安全限制-仅允许操作 staging/production 命名空间-禁止操作 production-critical 命名空间-Pod重启次数<5次才允许自动重启-所有操作都有详细审计日志

请使用 k8s-operator skill 重启 staging 命名空间的 checkout-api Pod

步骤2: 实现 Pod 重启功能

# skills/k8s-operator/actions/restart_pod.pyimport subprocessimport jsonimport timefrom datetime import datetimedef restart_pod(namespace: str, pod_name: str):    """    重启 Kubernetes Pod    Args:        namespace: 命名空间        pod_name: Pod 名称    Returns:        操作结果    """    # 0. 审计日志    log_audit("restart_pod", {        "namespace": namespace,        "pod_name": pod_name,        "timestamp": datetime.now().isoformat()    })    # 1. 安全检查: 验证命名空间白名单    if namespace in ['production-critical''kube-system']:        return {            'success'False,            'error'f'Namespace {namespace} is not allowed'        }    # 2. 安全检查: 验证 Pod 重启次数    restart_count = get_pod_restart_count(namespace, pod_name)    if restart_count >= 5:        return {            'success'False,            'error'f'Pod restart count ({restart_count}) exceeds limit (5)'        }    # 3. 记录操作前状态    before_state = get_pod_state(namespace, pod_name)    # 4. 执行重启 (删除 Pod,让 Deployment 自动重建)    cmd = ['kubectl''delete''pod', pod_name, '-n', namespace]    result = subprocess.run(cmd, capture_output=True, text=True)    if result.returncode != 0:        return {            'success'False,            'error': result.stderr        }    # 5. 等待 Pod 重建并 Ready    success = wait_for_pod_ready(namespace, pod_name, timeout=120)    if not success:        return {            'success'False,            'error''Pod failed to become ready after restart'        }    # 6. 记录操作后状态    after_state = get_pod_state(namespace, pod_name)    # 7. 返回结果    return {        'success'True,        'before': before_state,        'after': after_state,        'message'f'Pod {pod_name} restarted successfully'    }def get_pod_restart_count(namespace: str, pod_name: str) -> int:    """获取 Pod 重启次数"""    cmd = [        'kubectl''get''pod', pod_name, '-n', namespace,        '-o''jsonpath={.status.containerStatuses[0].restartCount}'    ]    result = subprocess.run(cmd, capture_output=True, text=True)    return int(result.stdout) if result.stdout else 0def get_pod_state(namespace: str, pod_name: str) -> dict:    """获取 Pod 当前状态"""    cmd = [        'kubectl''get''pod', pod_name, '-n', namespace,        '-o''json'    ]    result = subprocess.run(cmd, capture_output=True, text=True)    if result.returncode != 0:        return {'error': result.stderr}    pod = json.loads(result.stdout)    return {        'status': pod['status']['phase'],        'ready': pod['status'].get('conditions', [{}])[-1].get('status'),        'restart_count': pod['status']['containerStatuses'][0]['restartCount'],        'image': pod['spec']['containers'][0]['image']    }def wait_for_pod_ready(namespace: str, pod_name: str, timeout: int = 120) -> bool:    """等待 Pod 变为 Ready"""    start_time = time.time()    # 先获取 Pod 的 Label,因为删除后 Pod 名会变    label = get_pod_label(namespace, pod_name)    while time.time() - start_time < timeout:        # 通过 Label 查找新 Pod        pods = get_pods_by_label(namespace, label)        for pod in pods:            if pod['status'] == 'Running' and pod['ready'] == 'True':                return True        time.sleep(5)    return Falsedef log_audit(action: str, params: dict):    """记录审计日志"""    with open('/var/log/openclaw/audit.log''a'as f:        f.write(json.dumps({            'action': action,            'params': params,            'timestamp': datetime.now().isoformat()        }) + '\n')

步骤3: 测试 K8s 操作

# 手动测试python skills/k8s-operator/actions/restart_pod.py \--namespace staging \--pod-name checkout-api-7d8f9c5b6-abcde# OpenClaw 测试openclaw run "请使用 k8s-operator skill 重启 staging 的 checkout-api Pod"

Day 3-4: 创建更多修复操作 Skill (8小时)

目标: 扩展修复能力,覆盖常见故障场景。

场景1: 磁盘清理

# skills/system-operator/actions/cleanup_disk.pyimport subprocessimport osdef cleanup_disk(path: str, max_age_days:int=7):"""清理指定路径的旧文件Args:        path:路径(/tmp, /var/log/old 等)        max_age_days:保留天数"""# 安全检查: 只允许清理特定路径    allowed_paths =['/tmp','/var/log/old','/var/cache']if path notin allowed_paths:return{'success':False,'error'f'Path {path} is not in allowed list'}# 获取清理前磁盘使用率    before_usage = get_disk_usage(path)# 执行清理 (删除 N 天前的文件)    cmd =['find', path,'-type','f','-mtime'f'+{max_age_days}','-delete']    result = subprocess.run(cmd, capture_output=True, text=True)# 获取清理后磁盘使用率    after_usage = get_disk_usage(path)return{'success': result.returncode ==0,'before_usage': before_usage,'after_usage': after_usage,'freed_space': before_usage - after_usage}def get_disk_usage(path: str)->float:"""获取磁盘使用率"""    stat = os.statvfs(path)    total = stat.f_blocks * stat.f_frsize    used =(stat.f_blocks - stat.f_bfree)* stat.f_frsizereturn(used / total)*100

场景2: Kill 慢查询

# skills/database-operator/actions/kill_slow_query.pyimport pymysqldef kill_slow_queries(host: str, database: str, min_query_time:int=300):"""Kill慢查询Args:        host:数据库地址        database:数据库名        min_query_time:最小执行时间(秒)"""# 连接数据库    conn = pymysql.connect(host=host, user='admin', password='xxx', database=database)    cursor = conn.cursor()# 查找慢查询    cursor.execute(f"""        SELECT ID, TIME, INFO         FROM information_schema.PROCESSLIST         WHERE COMMAND ='Query'        AND TIME >{min_query_time}        AND USER !='system'""")    slow_queries = cursor.fetchall()    killed =[]# Kill 慢查询for query_id, query_time, query_info in slow_queries:        cursor.execute(f"KILL {query_id}")        killed.append({'id': query_id,'time': query_time,'query': query_info[:100]# 只记录前 100 个字符})    conn.close()return{'success':True,'killed_count'len(killed),'killed_queries': killed}

场景3: 缓存刷新

# skills/cache-operator/actions/flush_cache.pyimport redisdef flush_redis_cache(host: str, port:int=6379, pattern: str =None):"""刷新Redis缓存Args:        host:Redis地址        port:Redis端口        pattern:Key匹配模式(例如"user:*")"""    client = redis.Redis(host=host, port=port)if pattern:# 删除匹配的 Key        keys = client.keys(pattern)if keys:            client.delete(*keys)        deleted_count = len(keys)else:# 清空整个库 (谨慎使用)        client.flushdb()        deleted_count ="all"return{'success':True,'deleted_count': deleted_count,'pattern': pattern or'all'}

Day 5: 设计修复决策流程 (6小时)

目标: 让 OpenClaw 自动选择修复策略。

修复决策树

# skills/auto-remediation/decision_tree.pyREMEDIATION_RULES = [    {        'name''Pod CrashLoopBackOff',        'conditions': {            'pod_status''CrashLoopBackOff',            'restart_count': {'$lt'5},            'namespace': {'$nin': ['production-critical']}        },        'actions': [            {                'type''restart_pod',                'approval''auto',  # L3                'params': {                    'namespace''${namespace}',                    'pod_name''${pod_name}'                }            }        ],        'verification': {            'type''pod_status',            'expected''Running',            'timeout'120        }    },    {        'name''Disk Full',        'conditions': {            'disk_usage': {'$gt'90},            'mount_point': {'$in': ['/tmp''/var/log']}        },        'actions': [            {                'type''cleanup_disk',                'approval''auto',                'params': {                    'path''${mount_point}',                    'max_age_days'7                }            }        ],        'verification': {            'type''disk_usage',            'expected': {'$lt'80},            'timeout'60        }    },    {        'name''Database Connection Pool Exhausted',        'conditions': {            'error_pattern''connection.*pool.*timeout',            'service''checkout-api'        },        'actions': [            {                'type''kill_slow_query',                'approval''manual',  # L2 需要确认                'params': {                    'database''checkout_db',                    'min_query_time'300                }            },            {                'type''restart_pod',                'approval''manual',                'params': {                    'namespace''production',                    'pod_name''${pod_name}'                }            }        ],        'verification': {            'type''error_rate',            'expected': {'$lt'1},  # 错误率 < 1%            'timeout'300        }    }]def find_matching_rule(context: dict) -> dict:    """    根据故障上下文匹配修复规则    Args:        context: 故障上下文(来自根因分析)    Returns:        匹配的规则,如果没有返回 None    """    for rule in REMEDIATION_RULES:        if match_conditions(rule['conditions'], context):            return rule    return Nonedef match_conditions(conditions: dict, context: dict) -> bool:    """检查条件是否匹配"""    for key, expected in conditions.items():        actual = context.get(key)        if isinstance(expected, dict):            # 复杂条件 (例如 $gt, $lt, $in)            if '$gt' in expected and actual <= expected['$gt']:                return False            if '$lt' in expected and actual >= expected['$lt']:                return False            if '$in' in expected and actual not in expected['$in']:                return False            if '$nin' in expected and actual in expected['$nin']:                return False        else:            # 简单相等            if actual != expected:                return False    return True

Day 6: 串联完整闭环 (8小时)

目标: 从告警 → 诊断 → 修复 → 验证 → 通知,OpenClaw 一条龙处理。

核心:创建"自动修复编排" Skill

# skills/auto-remediation-workflow/SKILL.md## 自动修复编排 Skill### 功能接收告警,自动完成:诊断→决策→执行→验证→通知的完整闭环### 工作流程1.接收AlertmanagerWebhook2.调用根因分析Skill3.匹配修复规则4.调用具体修复Skill(k8s-operator/system-operator/database-operator)5.验证修复效果6.通知结果### 使用方法由AlertmanagerWebhook自动触发,或手动触发:

请使用 auto-remediation-workflow skill 处理 checkout-api 服务的 CrashLoopBackOff 告警

实现完整工作流

# skills/auto-remediation-workflow/orchestrator.pydef auto_remediation_workflow(alert: dict):    """    OpenClaw 自动修复完整流程    Args:        alert: 告警信息 (来自 Alertmanager)    Returns:        修复结果    """    workflow_id = generate_workflow_id()    log_workflow_start(workflow_id, alert)    try:        # ========== 第一步: 根因诊断 (调用上一篇的 Skill) ==========        print(f"[{workflow_id}] 步骤1: 诊断根因...")        diagnosis = call_openclaw_skill(            skill="victorialogs-rootcause",            params={                "service": alert['service'],                "time_range""10m"            }        )        log_diagnosis(workflow_id, diagnosis)        if not diagnosis['success']:            notify_failure(workflow_id, "诊断失败", diagnosis['error'])            return        # ========== 第二步: 选择修复策略 ==========        print(f"[{workflow_id}] 步骤2: 选择修复策略...")        remediation_rule = find_matching_rule(diagnosis['root_cause'])        if not remediation_rule:            # 没有匹配的规则,通知人工介入            notify_manual_intervention(workflow_id, diagnosis)            return        log_remediation_plan(workflow_id, remediation_rule)        # ========== 第三步: 执行修复 (调用具体操作 Skill) ==========        print(f"[{workflow_id}] 步骤3: 执行修复...")        # 检查是否需要人工确认        if remediation_rule['approval'] == 'manual':            approved = request_approval_via_slack(                workflow_id,                remediation_rule,                timeout=300  # 5分钟超时            )            if not approved:                notify_approval_timeout(workflow_id, remediation_rule)                return        # 调用具体修复 Skill        fix_result = call_openclaw_skill(            skill=remediation_rule['skill'],            params=remediation_rule['params']        )        log_execution(workflow_id, fix_result)        if not fix_result['success']:            notify_execution_failure(workflow_id, fix_result)            return        # ========== 第四步: 验证修复效果 ==========        print(f"[{workflow_id}] 步骤4: 验证修复效果...")        verification = verify_remediation(            verification_config=remediation_rule['verification'],            timeout=remediation_rule['verification']['timeout']        )        log_verification(workflow_id, verification)        if not verification['success']:            # 验证失败,尝试回退            print(f"[{workflow_id}] 验证失败,尝试回退...")            rollback_result = rollback_fix(workflow_id, remediation_rule)            notify_rollback(workflow_id, verification, rollback_result)            return        # ========== 第五步: 生成报告并通知 ==========        print(f"[{workflow_id}] 步骤5: 生成报告...")        report = generate_report(workflow_id, {            'alert': alert,            'diagnosis': diagnosis,            'remediation': remediation_rule,            'execution': fix_result,            'verification': verification        })        notify_success(workflow_id, report)        log_workflow_complete(workflow_id)    except Exception as e:        log_workflow_error(workflow_id, e)        notify_failure(workflow_id, "工作流异常"str(e))def call_openclaw_skill(skill: str, params: dict) -> dict:    """    调用 OpenClaw Skill    在 OpenClaw 内部,Skill 之间可以相互调用    """    # 构造 Skill 调用指令    prompt = f"请使用 {skill} skill 执行操作,参数: {json.dumps(params)}"    # OpenClaw 内部调用    result = openclaw.run_skill(skill, params)    return resultdef find_matching_rule(root_cause: str) -> dict:    """    根据根因匹配修复规则    这些规则是预定义的,经过验证的修复策略    """    # 修复规则库 (后面详细讲)    for rule in REMEDIATION_RULES:        if match_root_cause(rule['pattern'], root_cause):            return rule    return Nonedef verify_remediation(verification_config: dict, timeout: int) -> dict:    """    验证修复效果    OpenClaw 调用验证 Skill 检查系统状态    """    start_time = time.time()    while time.time() - start_time < timeout:        if verification_config['type'] == 'pod_status':            # 调用 k8s-operator skill 检查 Pod 状态            result = call_openclaw_skill(                skill="k8s-operator",                params={"action""get_pod_status", **verification_config['params']}            )            if result['status'] == verification_config['expected']:                return {'success'True'message''Pod 已恢复'}        elif verification_config['type'] == 'error_rate':            # 查询 VictoriaMetrics 检查错误率            error_rate = query_victoria_metrics(                'rate(http_requests_errors_total[5m])'            )            if error_rate < verification_config['threshold']:                return {'success'True'message'f'错误率已降至 {error_rate:.2f}%'}        elif verification_config['type'] == 'disk_usage':            # 调用 system-operator skill 检查磁盘            result = call_openclaw_skill(                skill="system-operator",                params={"action""get_disk_usage", **verification_config['params']}            )            if result['usage'] < verification_config['threshold']:                return {'success'True'message'f'磁盘使用率已降至 {result["usage"]}%'}        time.sleep(10)    return {'success'False'message''验证超时'}def request_approval_via_slack(workflow_id: str, rule: dict, timeout: int) -> bool:    """    通过 Slack 请求人工审批    发送交互式消息,等待用户点击"批准"或"拒绝"    """    message = {        "text"f"🚨 需要您的审批 - 工作流 {workflow_id}",        "blocks": [            {                "type""section",                "text": {                    "type""mrkdwn",                    "text"f"*修复操作:* {rule['description']}\n*影响范围:* {rule['impact']}\n*风险等级:* {rule['risk_level']}"                }            },            {                "type""actions",                "elements": [                    {                        "type""button",                        "text": {"type""plain_text""text""✅ 批准"},                        "style""primary",                        "value"f"approve_{workflow_id}"                    },                    {                        "type""button",                        "text": {"type""plain_text""text""❌ 拒绝"},                        "style""danger",                        "value"f"reject_{workflow_id}"                    }                ]            }        ]    }    # 发送到 Slack    send_slack_message(channel="#ops-alerts", message=message)    # 等待用户响应 (轮询或 Webhook)    start_time = time.time()    while time.time() - start_time < timeout:        approval_status = check_approval_status(workflow_id)        if approval_status == 'approved':            return True        elif approval_status == 'rejected':            return False        time.sleep(5)    # 超时    return False

Day 7: 测试和上线 (6小时)

测试场景

场景1: Pod CrashLoopBackOff (L3 自动修复)

# 模拟故障kubectl run test-crash --image=nginx --restart=Always-- sh -c "exit 1"# 触发告警(Prometheus)# 等待自动修复# 验证 Pod 已重启并恢复

场景2: 磁盘满 (L3 自动修复)

# 模拟磁盘满dd if=/dev/zero of=/tmp/bigfile bs=1M count=10000# 触发告警# 等待自动清理# 验证磁盘使用率下降

场景3: 数据库连接池满 (L2 人工确认)

# 模拟慢查询# 触发告警# OpenClaw 诊断 → 发现慢查询# 发送修复建议到 Slack# 人工点击"确认"按钮# Hermes 执行 kill 慢查询# 验证连接池恢复

灰度发布

第1周: 测试环境

只开启 L3(自动模式)只修复 Pod CrashLoopBackOff 和磁盘清理观察执行成功率

第2-3周: 生产环境试点

选择 1-2 个非关键服务开启 L3(自动模式)每天检查修复日志和效果

第4周: 扩大范围

增加更多服务开启 L2(建议模式)支持更多修复场景

五、三个月后的数据

故障修复效率

平均修复时间: 从 45 分钟降到 8 分钟

人工修复平均: 45 分钟(定位 + 修复 + 验证)自动修复平均: 8 分钟(触发 + 执行 + 验证)效率提升: 82%

自动化覆盖率

L3 自动修复覆盖: 40%

Pod CrashLoopBackOff: 25%磁盘满: 10%缓存清理: 5%L2 建议修复覆盖: 30%慢查询 kill: 15%服务重启: 10%配置回滚: 5%仍需人工处理: 30%

修复成功率

一次修复成功率: 85%

L3 自动修复成功率: 92%(操作简单,风险低)L2 建议修复成功率: 78%(需要人判断,可能选错)

误操作和回退

误操作次数: 3 次 / 3 个月

误删 Pod: 2 次(已自动重建,影响 < 1分钟)误杀查询: 1 次(业务已重试,无实际影响)回退成功率: 100%

成本

总成本: $150/月

OpenClaw API 调用: $80/月Hermes Agent 服务器: $50/月(1台 2C4G)监控和日志存储: $20/月

ROI

节省时间: 60 小时/月

故障次数: 40 次/月平均节省: 1.5 小时/次按时薪 $50 算: $3000/月投资回报率: 20 倍

六、三个血泪教训

教训1: 不要低估回退的重要性

反面案例:

第 2 周时,我们自动重启了一个 Pod,但忘了这个 Pod 是有状态的,里面缓存了用户会话。

重启后,100+ 用户被强制登出。

虽然业务影响不大(重新登录即可),但用户体验很差。

改进:

给每个修复操作打标签: stateless | statefulstateful 的操作不能自动重启,必须走 L2 确认重启前先检查是否有活跃连接

教训2: 验证一定要充分

反面案例:

我们的验证逻辑只检查"Pod 状态是 Running",但没检查"服务是否真的可用"。

结果有一次 Pod 起来了,但应用启动失败,我们却认为"修复成功"。

改进:

不只检查 Pod 状态,还要检查:
HTTP 健康检查关键指标恢复错误率下降
持续观察 10 分钟,而不是只看一瞬间

教训3: 人工确认要有超时机制

反面案例:

L2 修复需要人工确认,我们发了消息到 Slack,然后就一直等。

结果那天正好是周末,值班同学没看到,系统等了 2 小时还在等。

改进:

人工确认设置超时(5-10分钟)超时后:
如果是低风险操作,自动执行如果是高风险操作,升级告警(电话、短信)如果还是没人响应,记录日志并放弃

七、适合你的场景吗?

适合的团队

✅ 有基础监控体系(Prometheus, ELK, VictoriaLogs 等) 

✅ 故障类型相对固定(常见的几种问题反复出现)

✅ 有明确的修复 SOP(知道怎么修,只是嫌慢)

✅ 团队接受 AI 辅助(不排斥自动化) 

✅ 有一定开发能力(能写 Python 脚本)

不适合的场景

❌ 监控数据不全(连日志都没有,AI 无法分析) 

❌ 故障千奇百怪(每次都是新问题,无法沉淀规则) 

❌ 修复操作极其复杂(需要多个系统配合,无法自动化) 

❌ 团队强烈抵触(担心 AI 搞坏系统) 

❌ 没有回退机制(修复后无法撤销,风险太高)


八、下一步可以做什么

短期优化

1.扩大修复场景库
内存泄漏 → 重启 + 保留 Heap Dump网络抖动 → 重试 + 切换备用节点配置错误 → 自动回滚到上一版本
2.优化人工确认体验
在 Slack 里直接点按钮确认,不用跳转提供修复预览(会做什么操作)提供影响评估(可能影响多少用户)
3.增强验证能力
自动化业务功能验证(下单、登录等)集成 SLA 监控(延迟、可用性)自动生成验证报告

长期规划

1.预测性修复
不等故障发生,提前干预例如: 检测到连接池使用率持续上升 → 提前扩容
2.知识库自学习
每次修复后,记录"诊断-修复-结果"AI 从历史案例中学习,自动优化决策树
3.多云/混合云支持
支持 AWS、GCP、阿里云、腾讯云支持 Kubernetes、虚拟机、Serverless

最后

这套方案的核心不是"AI 多聪明"。

而是把确定性的、重复性的修复操作自动化,把人从救火中解放出来。

AI 不会替代 SRE,但会用 AI 的 SRE 会替代不会用的。

从定位到修复,闭环才是王道。


💬 说说你的想法

如果你也在做自动化修复相关的工作,评论区聊聊:

1.你们现在怎么修复故障? 还在手动操作吗?2.最担心自动修复的哪个环节? 误操作? 回退? 还是权限?3.有没有尝试过自动化修复? 效果如何? 遇到什么坑?

如果这篇文章对你有帮助,点个"在看",让更多 SRE 看到。


📚 相关资源

OpenClaw 官网: https://openclaw.ai/OpenClaw Skill 文档: https://docs.openclaw.ai/skillsKubernetes Operator 模式: https://kubernetes.io/docs/concepts/extend-kubernetes/operator/VictoriaLogs 官网: https://victoriametrics.com/products/victorialogs/

🚀 下期预告

下一篇我会写OpenClaw 成本优化实战,如何用 AI 把云资源成本降低 30%。

关注我,不错过 AI 运维实战系列。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-04-15 03:30:12 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/529841.html
  2. 运行时间 : 0.109856s [ 吞吐率:9.10req/s ] 内存消耗:4,850.76kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=0e2d0847eb0ac21708d56b25e83bb226
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.80 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000573s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000816s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000335s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000283s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000555s ]
  6. SELECT * FROM `set` [ RunTime:0.000259s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000616s ]
  8. SELECT * FROM `article` WHERE `id` = 529841 LIMIT 1 [ RunTime:0.001811s ]
  9. UPDATE `article` SET `lasttime` = 1776195012 WHERE `id` = 529841 [ RunTime:0.007273s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.011814s ]
  11. SELECT * FROM `article` WHERE `id` < 529841 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000746s ]
  12. SELECT * FROM `article` WHERE `id` > 529841 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000623s ]
  13. SELECT * FROM `article` WHERE `id` < 529841 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001455s ]
  14. SELECT * FROM `article` WHERE `id` < 529841 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001138s ]
  15. SELECT * FROM `article` WHERE `id` < 529841 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.004584s ]
0.111582s