【NPU】Ascend Docker Runtime v26.0.1 之一 runtime/main.go — 超深度分析

runtime/main.go --- 超深度逐行分析

文件行数:58行(含License 16行)| 核心代码:42行

模块定位:ascend-docker-runtime 运行时入口


一、模块定位

1.1 业务职责

runtime/main.go 是整个 ascend-docker-runtime 二进制的入口文件。当 Docker/Containerd 需要创建容器时,会调用此程序作为 OCI Runtime。该文件负责:

  1. 日志系统初始化 --- 配置hwlog日志组件
  2. 安全前置校验 --- 对命令行参数进行白名单过滤
  3. 日志权限管理 --- defer修改日志文件权限
  4. 主流程分发 --- 调用 process.DoProcess() 执行核心逻辑

1.2 在系统中的位置

#mermaid-svg-N0BGD7HCb6mFo8Xn{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-N0BGD7HCb6mFo8Xn .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-N0BGD7HCb6mFo8Xn .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-N0BGD7HCb6mFo8Xn .error-icon{fill:#552222;}#mermaid-svg-N0BGD7HCb6mFo8Xn .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-N0BGD7HCb6mFo8Xn .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-N0BGD7HCb6mFo8Xn .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-N0BGD7HCb6mFo8Xn .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-N0BGD7HCb6mFo8Xn .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-N0BGD7HCb6mFo8Xn .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-N0BGD7HCb6mFo8Xn .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-N0BGD7HCb6mFo8Xn .marker{fill:#333333;stroke:#333333;}#mermaid-svg-N0BGD7HCb6mFo8Xn .marker.cross{stroke:#333333;}#mermaid-svg-N0BGD7HCb6mFo8Xn svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-N0BGD7HCb6mFo8Xn p{margin:0;}#mermaid-svg-N0BGD7HCb6mFo8Xn .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-N0BGD7HCb6mFo8Xn .cluster-label text{fill:#333;}#mermaid-svg-N0BGD7HCb6mFo8Xn .cluster-label span{color:#333;}#mermaid-svg-N0BGD7HCb6mFo8Xn .cluster-label span p{background-color:transparent;}#mermaid-svg-N0BGD7HCb6mFo8Xn .label text,#mermaid-svg-N0BGD7HCb6mFo8Xn span{fill:#333;color:#333;}#mermaid-svg-N0BGD7HCb6mFo8Xn .node rect,#mermaid-svg-N0BGD7HCb6mFo8Xn .node circle,#mermaid-svg-N0BGD7HCb6mFo8Xn .node ellipse,#mermaid-svg-N0BGD7HCb6mFo8Xn .node polygon,#mermaid-svg-N0BGD7HCb6mFo8Xn .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-N0BGD7HCb6mFo8Xn .rough-node .label text,#mermaid-svg-N0BGD7HCb6mFo8Xn .node .label text,#mermaid-svg-N0BGD7HCb6mFo8Xn .image-shape .label,#mermaid-svg-N0BGD7HCb6mFo8Xn .icon-shape .label{text-anchor:middle;}#mermaid-svg-N0BGD7HCb6mFo8Xn .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-N0BGD7HCb6mFo8Xn .rough-node .label,#mermaid-svg-N0BGD7HCb6mFo8Xn .node .label,#mermaid-svg-N0BGD7HCb6mFo8Xn .image-shape .label,#mermaid-svg-N0BGD7HCb6mFo8Xn .icon-shape .label{text-align:center;}#mermaid-svg-N0BGD7HCb6mFo8Xn .node.clickable{cursor:pointer;}#mermaid-svg-N0BGD7HCb6mFo8Xn .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-N0BGD7HCb6mFo8Xn .arrowheadPath{fill:#333333;}#mermaid-svg-N0BGD7HCb6mFo8Xn .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-N0BGD7HCb6mFo8Xn .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-N0BGD7HCb6mFo8Xn .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-N0BGD7HCb6mFo8Xn .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-N0BGD7HCb6mFo8Xn .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-N0BGD7HCb6mFo8Xn .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-N0BGD7HCb6mFo8Xn .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-N0BGD7HCb6mFo8Xn .cluster text{fill:#333;}#mermaid-svg-N0BGD7HCb6mFo8Xn .cluster span{color:#333;}#mermaid-svg-N0BGD7HCb6mFo8Xn div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-N0BGD7HCb6mFo8Xn .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-N0BGD7HCb6mFo8Xn rect.text{fill:none;stroke-width:0;}#mermaid-svg-N0BGD7HCb6mFo8Xn .icon-shape,#mermaid-svg-N0BGD7HCb6mFo8Xn .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-N0BGD7HCb6mFo8Xn .icon-shape p,#mermaid-svg-N0BGD7HCb6mFo8Xn .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-N0BGD7HCb6mFo8Xn .icon-shape .label rect,#mermaid-svg-N0BGD7HCb6mFo8Xn .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-N0BGD7HCb6mFo8Xn .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-N0BGD7HCb6mFo8Xn .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-N0BGD7HCb6mFo8Xn :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} exec
1
2
3
4
defer
Docker/Containerd
runtime/main.go

入口函数
InitLogModule

日志初始化
GetLogPrefix

获取日志前缀
StringChecker

参数安全校验
process.DoProcess

核心流程
ChangeRuntimeLogMode

日志权限修改


二、源码逐行解析

2.1 包声明与导入(第17-30行)

go 复制代码
package main

import (
    "context"
    "fmt"
    "log"
    "os"
    "strings"

    "ascend-common/common-utils/hwlog"
    "ascend-docker-runtime/mindxcheckutils"
    "ascend-docker-runtime/runtime/process"
)
导入项 来源 作用
context Go标准库 创建可取消的上下文,用于日志组件生命周期管理
fmt Go标准库 格式化输出(fmt.Println
log Go标准库 标准日志(log.Fatal 用于致命错误终止程序)
os Go标准库 获取命令行参数 os.Args、环境变量
strings Go标准库 strings.Join 拼接参数字符串用于安全校验
hwlog ascend-common 华为日志组件,提供结构化日志能力
mindxcheckutils 本项目 安全工具包,提供字符串白名单校验
process 本项目 核心处理包,包含 DoProcess()InitLogModule()

设计意图 :依赖最小化,仅导入必要包。context 用于日志组件的优雅关闭。

2.2 main函数 --- panic恢复(第32-35行)

go 复制代码
func main() {
    defer func() {
        if err := recover(); err != nil {
            log.Fatal(err)
        }
    }()
  • defer + recover() 捕获所有panic,防止程序崩溃时无日志输出
  • log.Fatal(err) 在panic发生时打印错误并 os.Exit(1)
  • 设计意图:确保任何未预期的panic都能被记录到日志,而非静默崩溃

2.3 创建上下文(第36行)

go 复制代码
    ctx, _ := context.WithCancel(context.Background())
  • context.Background() 创建根上下文
  • context.WithCancel 返回可取消的ctx和cancel函数
  • cancel函数被丢弃(_:ctx不会被显式取消,仅随进程退出结束
  • 设计意图:hwlog需要context参数管理日志goroutine生命周期,此处仅作形式参数

2.4 日志模块初始化(第37-39行)

go 复制代码
    if err := process.InitLogModule(ctx); err != nil {
        log.Fatal(err)
    }
  • 调用 process.InitLogModule(ctx) 初始化hwlog日志组件
  • 日志配置:日志路径 api.RunTimeRunLogPath、级别0(DEBUG)、最大备份2个、最大保留365天、单文件2MB
  • 如果初始化失败,log.Fatal(err) 终止程序
  • 设计意图:日志是调试基础,必须最先初始化,否则后续错误无法追溯

2.5 获取日志前缀(第40-43行)

go 复制代码
    logPrefixWords, err := mindxcheckutils.GetLogPrefix()
    if err != nil {
        log.Fatal(err)
    }
  • GetLogPrefix() 返回格式为 "uid: <uid> tty: <tty>" 的前缀字符串
  • 内部实现:读取 /proc/self/fd/0 获取终端路径,读取 os.Geteuid() 获取用户ID
  • 此前缀附加到后续所有日志消息中,便于审计追踪
  • 设计意图:安全审计需要知道执行者的UID和终端信息

2.6 defer日志权限修改(第44-47行)

go 复制代码
    defer func() {
        if err = mindxcheckutils.ChangeRuntimeLogMode("runtime-run-"); err != nil {
            fmt.Println("defer changeFileMode function failed")
        }
    }()
  • ChangeRuntimeLogMode("runtime-run-") 在程序退出时将日志文件权限修改为 0400(仅所有者可读)
  • 参数 "runtime-run-" 是日志文件名前缀,只修改以此前缀开头的日志文件
  • 使用defer确保无论程序正常退出还是异常退出,日志权限都被收紧
  • 设计意图:运行时日志可能包含敏感信息(设备ID、路径等),退出后应限制读取权限

2.7 命令行参数安全校验(第48-52行)

go 复制代码
    if !mindxcheckutils.StringChecker(strings.Join(os.Args, " "), 0,
        process.MaxCommandLength, mindxcheckutils.DefaultWhiteList+" ") {
        hwlog.RunLog.Errorf("%v docker runtime args check failed", logPrefixWords)
        log.Fatal("command error")
    }

逐参数解析

参数 含义
text strings.Join(os.Args, " ") 将所有命令行参数用空格拼接成字符串
minLength 0 最小长度为0
maxLength process.MaxCommandLength (65535) 最大长度65535
whiteList DefaultWhiteList+" " 白名单字符:-_./~ + 空格
  • StringChecker 逐字符检查:只允许字母(a-z, A-Z)、数字(0-9)和白名单字符
  • 校验失败:记录hwlog错误日志 + log.Fatal 终止程序
  • 设计意图:防止命令注入攻击。OCI Runtime接收外部输入,必须做输入校验

2.8 调用核心处理流程(第53-57行)

go 复制代码
    if err = process.DoProcess(); err != nil {
        hwlog.RunLog.Errorf("%v docker runtime failed: %v", logPrefixWords, err)
        log.Fatal(err)
    }
}
  • process.DoProcess() 是整个运行时的核心函数,负责:
    • 解析命令行参数(--bundlecreate
    • 读取并修改OCI Spec(config.json)
    • 注入NPU设备到Spec
    • 注入Prestart/Poststop Hook到Spec
    • 执行runc
  • 错误处理:记录带前缀的hwlog错误日志,然后 log.Fatal 终止
  • 设计意图:main函数保持极简,所有业务逻辑委托给process包

三、执行流程图

#mermaid-svg-tqi0NGHmhOjWHK0L{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-tqi0NGHmhOjWHK0L .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-tqi0NGHmhOjWHK0L .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-tqi0NGHmhOjWHK0L .error-icon{fill:#552222;}#mermaid-svg-tqi0NGHmhOjWHK0L .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tqi0NGHmhOjWHK0L .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-tqi0NGHmhOjWHK0L .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tqi0NGHmhOjWHK0L .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tqi0NGHmhOjWHK0L .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-tqi0NGHmhOjWHK0L .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tqi0NGHmhOjWHK0L .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tqi0NGHmhOjWHK0L .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tqi0NGHmhOjWHK0L .marker.cross{stroke:#333333;}#mermaid-svg-tqi0NGHmhOjWHK0L svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tqi0NGHmhOjWHK0L p{margin:0;}#mermaid-svg-tqi0NGHmhOjWHK0L .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-tqi0NGHmhOjWHK0L .cluster-label text{fill:#333;}#mermaid-svg-tqi0NGHmhOjWHK0L .cluster-label span{color:#333;}#mermaid-svg-tqi0NGHmhOjWHK0L .cluster-label span p{background-color:transparent;}#mermaid-svg-tqi0NGHmhOjWHK0L .label text,#mermaid-svg-tqi0NGHmhOjWHK0L span{fill:#333;color:#333;}#mermaid-svg-tqi0NGHmhOjWHK0L .node rect,#mermaid-svg-tqi0NGHmhOjWHK0L .node circle,#mermaid-svg-tqi0NGHmhOjWHK0L .node ellipse,#mermaid-svg-tqi0NGHmhOjWHK0L .node polygon,#mermaid-svg-tqi0NGHmhOjWHK0L .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tqi0NGHmhOjWHK0L .rough-node .label text,#mermaid-svg-tqi0NGHmhOjWHK0L .node .label text,#mermaid-svg-tqi0NGHmhOjWHK0L .image-shape .label,#mermaid-svg-tqi0NGHmhOjWHK0L .icon-shape .label{text-anchor:middle;}#mermaid-svg-tqi0NGHmhOjWHK0L .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-tqi0NGHmhOjWHK0L .rough-node .label,#mermaid-svg-tqi0NGHmhOjWHK0L .node .label,#mermaid-svg-tqi0NGHmhOjWHK0L .image-shape .label,#mermaid-svg-tqi0NGHmhOjWHK0L .icon-shape .label{text-align:center;}#mermaid-svg-tqi0NGHmhOjWHK0L .node.clickable{cursor:pointer;}#mermaid-svg-tqi0NGHmhOjWHK0L .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-tqi0NGHmhOjWHK0L .arrowheadPath{fill:#333333;}#mermaid-svg-tqi0NGHmhOjWHK0L .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tqi0NGHmhOjWHK0L .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tqi0NGHmhOjWHK0L .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tqi0NGHmhOjWHK0L .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-tqi0NGHmhOjWHK0L .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tqi0NGHmhOjWHK0L .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-tqi0NGHmhOjWHK0L .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tqi0NGHmhOjWHK0L .cluster text{fill:#333;}#mermaid-svg-tqi0NGHmhOjWHK0L .cluster span{color:#333;}#mermaid-svg-tqi0NGHmhOjWHK0L div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-tqi0NGHmhOjWHK0L .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-tqi0NGHmhOjWHK0L rect.text{fill:none;stroke-width:0;}#mermaid-svg-tqi0NGHmhOjWHK0L .icon-shape,#mermaid-svg-tqi0NGHmhOjWHK0L .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tqi0NGHmhOjWHK0L .icon-shape p,#mermaid-svg-tqi0NGHmhOjWHK0L .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-tqi0NGHmhOjWHK0L .icon-shape .label rect,#mermaid-svg-tqi0NGHmhOjWHK0L .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tqi0NGHmhOjWHK0L .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-tqi0NGHmhOjWHK0L .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-tqi0NGHmhOjWHK0L :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 失败
成功
失败
成功
失败
成功
失败
成功
main函数启动
defer panic恢复
创建context
InitLogModule

日志初始化
log.Fatal终止
GetLogPrefix

获取uid+tty前缀
log.Fatal终止
defer ChangeRuntimeLogMode

退出时收紧日志权限
StringChecker

参数白名单校验
log.Fatal终止
process.DoProcess

核心处理
log.Fatal终止
程序正常退出


四、关键设计决策

决策 原因 实现
panic恢复 防止goroutine panic导致无日志崩溃 defer recover()
日志最先初始化 后续所有操作都需要日志记录 第一行就调用InitLogModule
参数安全校验 防止命令注入,OCI Runtime接收外部输入 StringChecker白名单过滤
defer日志权限收紧 日志含敏感信息,运行后应限制访问 ChangeRuntimeLogMode设为0400
业务逻辑委托 main函数保持简洁可维护 所有逻辑在process包中

五、与process包的关系

#mermaid-svg-1TJInB1MPKnGcs1Q{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1TJInB1MPKnGcs1Q .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1TJInB1MPKnGcs1Q .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1TJInB1MPKnGcs1Q .error-icon{fill:#552222;}#mermaid-svg-1TJInB1MPKnGcs1Q .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1TJInB1MPKnGcs1Q .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1TJInB1MPKnGcs1Q .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1TJInB1MPKnGcs1Q .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1TJInB1MPKnGcs1Q .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1TJInB1MPKnGcs1Q .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1TJInB1MPKnGcs1Q .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1TJInB1MPKnGcs1Q .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1TJInB1MPKnGcs1Q .marker.cross{stroke:#333333;}#mermaid-svg-1TJInB1MPKnGcs1Q svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1TJInB1MPKnGcs1Q p{margin:0;}#mermaid-svg-1TJInB1MPKnGcs1Q g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-1TJInB1MPKnGcs1Q g.classGroup text .title{font-weight:bolder;}#mermaid-svg-1TJInB1MPKnGcs1Q .cluster-label text{fill:#333;}#mermaid-svg-1TJInB1MPKnGcs1Q .cluster-label span{color:#333;}#mermaid-svg-1TJInB1MPKnGcs1Q .cluster-label span p{background-color:transparent;}#mermaid-svg-1TJInB1MPKnGcs1Q .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1TJInB1MPKnGcs1Q .cluster text{fill:#333;}#mermaid-svg-1TJInB1MPKnGcs1Q .cluster span{color:#333;}#mermaid-svg-1TJInB1MPKnGcs1Q .nodeLabel,#mermaid-svg-1TJInB1MPKnGcs1Q .edgeLabel{color:#131300;}#mermaid-svg-1TJInB1MPKnGcs1Q .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-1TJInB1MPKnGcs1Q .label text{fill:#131300;}#mermaid-svg-1TJInB1MPKnGcs1Q .labelBkg{background:#ECECFF;}#mermaid-svg-1TJInB1MPKnGcs1Q .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-1TJInB1MPKnGcs1Q .classTitle{font-weight:bolder;}#mermaid-svg-1TJInB1MPKnGcs1Q .node rect,#mermaid-svg-1TJInB1MPKnGcs1Q .node circle,#mermaid-svg-1TJInB1MPKnGcs1Q .node ellipse,#mermaid-svg-1TJInB1MPKnGcs1Q .node polygon,#mermaid-svg-1TJInB1MPKnGcs1Q .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1TJInB1MPKnGcs1Q .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q g.clickable{cursor:pointer;}#mermaid-svg-1TJInB1MPKnGcs1Q g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-1TJInB1MPKnGcs1Q g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-1TJInB1MPKnGcs1Q .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-1TJInB1MPKnGcs1Q .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-1TJInB1MPKnGcs1Q .dashed-line{stroke-dasharray:3;}#mermaid-svg-1TJInB1MPKnGcs1Q .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-1TJInB1MPKnGcs1Q #compositionStart,#mermaid-svg-1TJInB1MPKnGcs1Q .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q #compositionEnd,#mermaid-svg-1TJInB1MPKnGcs1Q .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q #dependencyStart,#mermaid-svg-1TJInB1MPKnGcs1Q .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q #dependencyStart,#mermaid-svg-1TJInB1MPKnGcs1Q .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q #extensionStart,#mermaid-svg-1TJInB1MPKnGcs1Q .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q #extensionEnd,#mermaid-svg-1TJInB1MPKnGcs1Q .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q #aggregationStart,#mermaid-svg-1TJInB1MPKnGcs1Q .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q #aggregationEnd,#mermaid-svg-1TJInB1MPKnGcs1Q .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q #lollipopStart,#mermaid-svg-1TJInB1MPKnGcs1Q .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q #lollipopEnd,#mermaid-svg-1TJInB1MPKnGcs1Q .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-1TJInB1MPKnGcs1Q .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-1TJInB1MPKnGcs1Q .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-1TJInB1MPKnGcs1Q .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-1TJInB1MPKnGcs1Q :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 调用InitLogModule + DoProcess
调用安全校验函数
内部也调用安全校验
main_go
+main()
process_pkg
+MaxCommandLength int
+InitLogModule(ctx) : error
+DoProcess() : error
mindxcheckutils_pkg
+GetLogPrefix()(string, error)
+StringChecker(text, min, max, whitelist) : bool
+ChangeRuntimeLogMode(prefix) : error

相关推荐
画中有画1 小时前
云原生可观测性体系设计及其应用
云原生
禅思院2 小时前
流式 Markdown 渲染完全指南【引子】
前端·架构·前端框架
翼龙云_cloud2 小时前
阿里云国际站代理商:ECS弹性伸缩 自动应对流量高峰
运维·网络·数据库·阿里云·架构
刹那芳华19922 小时前
基于 Docker 的 LLaMA-Factory 全流程部署指南
docker·容器·llama
zandy10112 小时前
2026年,AI Agent搜索Skill推荐已经离不开底层架构
大数据·人工智能·架构
Freed&2 小时前
K8s 1.29 集群部署文档
云原生·容器·kubernetes
深入云栈2 小时前
从零手写连接池:Redisson ConnectionsHolder设计与简化实现
java·架构
名为沙丁鱼的猫7294 小时前
【审计日志组件实践复盘】前端工程化 + 后端DDD架构(AOP切面拦截日志) + MBG
前端·架构
人间凡尔赛4 小时前
告别冷启动!WebAssembly + Spin 实战:Serverless 延迟从 1 秒降到 1 毫秒
后端·云原生·serverless·webassembly·spin