feat(registry): 注册中心日志记录到文件,添加日志轮转配置 - #23
Conversation
|
head_sha: 变更摘要此 PR 为注册中心后端添加了日志文件记录与每日轮转能力。核心改动包括:新增 主要改动
|
|
head_sha: 代码审查Good — Python >= 3.10 is required. So Now let me continue my analysis. The Python version is >= 3.10, so:
All good. Now let me focus on the actual issues in the diff: File 1:
|
|
|
| self.baseFilename = str(self._log_dir / self._dated_name(date.today())) | ||
| self.stream = self._open() | ||
| self._prune() | ||
| self.rolloverAt = self.computeRollover(time.time()) |
There was a problem hiding this comment.
head_sha: 4cbf2fb56c805a4059acbee0a1199466cf351ff5
🟠 High Priority
changed line → affected behavior/contract → failure mode → suggested fix
log.py 第 39-53 行 doRollover 方法:先关闭 stream(第 40-42 行),再执行 gzip 压缩(第 46-48 行)。如果 gzip 阶段因磁盘满、权限错误、I/O 错误等原因抛出异常,异常沿 emit() → handleError() 传播,错误信息被打印到 stderr,但 self.stream 已为 None,且永远不会被重新打开。此后所有 emit() 调用中 self.stream.write(...) 触发 AttributeError,被 handleError 静默吞掉,直到下一次 rollover(~24 小时后)才会有新流。
触发条件:磁盘满是最现实的生产环境场景。日志文件可能很大,gzip 写压缩文件需要额外磁盘空间。
后果:后续最多 24 小时的日志全部静默丢失。运维只能从 stderr 看到一条 traceback,但无法恢复日志。
修复方向:在 doRollover 中用 try/finally 保护:gzip 步骤应放在 try 块中;无论成功与否,finally 块都必须重新打开一个新文件流并设置 self.rolloverAt,确保 handler 绝不会处于 stream 为 None 的状态。如果 gzip 失败,可记录 warning 并跳过压缩(旧 .log 文件保留在原地不压缩),然后正常打开当天新文件。
建议:用 try/finally 重构 doRollover:在 finally 块中确保无论 gzip 成功与否都重新打开新文件流并设置 rolloverAt。gzip 失败时记录 warning 并跳过压缩,保留原始 .log 文件。
There was a problem hiding this comment.
head_sha: 09b6b499d06b11887cda2d12faf7dd4ab88517f8
已修复
4cbf2fb to
09b6b49
Compare
Paired: GitHub #23 ↔ GitCode !277
注册中心日志记录到文件,添加日志轮转配置
需要配合安装脚本的修改才能生效
如果没有配置日志路径,则需要用journalctl查看日志
What type of PR is this?
/kind
Self-checklist:(请自检,在[ ]内打上x,我们将检视你的完成情况,否则会导致pr无法合入)