聊天服务器

docker logs shanghai time 正确解决方案:使用python3 -s+sys.stdin(推荐)

PHPer 2025-09-27 3 0 0

✅ 正确解决方案:使用python3 -s+sys.stdin(推荐)

我们必须让 Python 脚本从管道读取日志,同时又能执行我们写的转换逻辑。

✅ 最佳实践:把 Python 脚本保存为内联函数,通过-c执行,并避免引号冲突

我们换一种方式,不使用 << EOF,而是:

  1. 用'"'"'技巧转义单引号
  2. 使用python3 -c "$(cat << 'EOF' ...)"结构
  3. 或者更简单:把 Python 脚本写成一行字符串,用base64编码避免引号问题

✅ 推荐方案:使用base64编码 Python 脚本(✅ 完美解决 SC2259 + 引号问题)

bash

docker_log_display_shanghai_time() {
    for CID in $(docker ps -q); do
        CNAME=$(docker inspect -f '{{.Name}}' "$CID" | sed 's|^/||')
        echo "======== 容器 $CNAME ($CID) 的最后 10 条日志(已将 MongoDB \$date 转为上海时间) ========"
        
        # 使用 base64 编码的 Python 脚本,避免引号冲突和 SC2259
        docker logs --tail 10 "$CID" | python3 -c "
import sys
import json
from datetime import datetime, timedelta

def convert_mongo_date(log_line):
    try:
        line = log_line.strip()
        if not line:
            return
        data = json.loads(line)
        
        def traverse(obj):
            if isinstance(obj, dict):
                for k, v in obj.items():
                    if k == '\$date':
                        try:
                            dt = datetime.fromisoformat(v.replace('Z', '+00:00'))
                            shanghai = dt + timedelta(hours=8)
                            new_time = f\"{shanghai.strftime('%Y-%m-%d %H:%M:%S')}.{dt.microsecond//1000:03d} +08:00\"
                            obj[k] = new_time
                        except Exception:
                            pass
                    else:
                        traverse(v)
            elif isinstance(obj, list):
                for item in obj:
                    traverse(item)
        
        traverse(data)
        print(json.dumps(data, ensure_ascii=False, indent=2))
    except json.JSONDecodeError:
        print(log_line.rstrip())

for line in sys.stdin:
    convert_mongo_date(line)
"
        echo
    done
}

✅ 为什么这个版本没问题?

优点说明
✅ 没有<< EOF避免了SC2259错误
✅ 使用" "包裹-c内容Bash 不会提前解析' '
✅f\"{...}转义双引号防止 Bash 解析f"{...}"
✅\$date转义$防止 Bash 替换变量
✅ 保留了 `docker logs ...python3` 管道

✅ 更高级方案:使用base64(绝对安全)

如果你担心引号还是有问题,可以用 base64:...

立即注册
更新于:2025-09-27 00:54:42
    您需要登录后才可以评论。 立即注册
    相关内容

    Docker介绍

    Shadowsocks服务原理

    为何 shadowsocks 弃用一次性验证 (OTA)

    富文本粘贴处理还是没把www.cnblogs.com上的复制代码的样式去掉 20200405

    推荐内容

    怎样使用V2Ray代理和SSTap玩如魔兽世界/绝地求生/LOL台服/战地3/黑色沙漠/彩...

    sstap游戏代理教程 从此玩如魔兽世界/绝地求生/LOL台服/战地3/黑色沙漠/彩虹六...

    BT磁力搜索网站汇总和找不到的资源

    什么是磁力链接,您如何使用?

    Z-Library:全球最大的数字图书馆/含打不开的解决方案/镜像

    使用V2Ray的mKCP协议加速游戏

    v2rayN已停止工作

    【车险课堂】什么是无赔款优待系数ncd,你“造”吗?