转 聊天服务器
|-转 docker logs shanghai time 正确解决方案:使用python3 -s+sys.stdin(推荐)
✅ 正确解决方案:使用python3 -s+sys.stdin(推荐)
我们必须让 Python 脚本从管道读取日志,同时又能执行我们写的转换逻辑。
✅ 最佳实践:把 Python 脚本保存为内联函数,通过-c执行,并避免引号冲突
我们换一种方式,不使用 << EOF,而是:
- 用'"'"'技巧转义单引号
- 使用python3 -c "$(cat << 'EOF' ...)"结构
- 或者更简单:把 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
推荐内容