fix(docker): 预创建 /app/logs 并赋属主,修复卷挂载点 root 权限拒绝
生产实测: applogs 命名卷挂到 /app/logs 时挂载点由 Docker 以 root:root 创建,而非 root 进程(profeto)写入 app.log 时 PermissionError(Errno 13), best-effort 降级生效但文件日志实际未启用。 - Dockerfile: 镜像内预创建 /app/logs 并 chown(chown -R 已有,覆盖新目录); 命名卷为空且首次挂载时 Docker 会复制镜像目录属主,重建镜像即可修复 - log_buffer: PermissionError 单独捕获,warning 给出可操作的排查方向 (镜像预建目录/chown/重建空卷),其余异常仍保持原通用降级
This commit is contained in:
@@ -112,6 +112,15 @@ def setup_logging(level: str = "INFO", log_file: str = "") -> None:
|
||||
file_handler.addFilter(_SQLNoiseFilter())
|
||||
root.addHandler(file_handler)
|
||||
logging.getLogger(__name__).info("文件日志已启用: %s", log_file)
|
||||
except PermissionError:
|
||||
# 容器场景最常见:挂载卷目录属主是 root,进程是非 root 用户。
|
||||
# 修复方向:镜像内预创建目录并 chown(Dockerfile),或重建空卷。
|
||||
logging.getLogger(__name__).warning(
|
||||
"启用文件日志失败(%s):无写权限。容器部署请确认镜像已预创建该目录"
|
||||
"并 chown 给运行用户(compose 卷挂载点默认 root 属主);"
|
||||
"宿主机直跑请检查目录权限。本次仅保留 stdout/内存日志。",
|
||||
log_file,
|
||||
)
|
||||
except Exception:
|
||||
logging.getLogger(__name__).warning(
|
||||
"启用文件日志失败(%s),仅保留 stdout/内存日志", log_file, exc_info=True,
|
||||
|
||||
Reference in New Issue
Block a user