CentOS 上 Python 日志管理实用指南
一 基础配置与输出位置
- 使用 Python 内置的 logging 模块即可满足大多数场景,支持同时输出到文件与控制台,并可按级别分流。示例要点:创建 Logger、添加 FileHandler/StreamHandler、设置 Formatter 与 Level,在 CentOS 上直接运行脚本即可生效。日志的默认保存位置由代码决定:若使用相对路径(如 ‘app.log’),文件会生成在执行脚本的当前工作目录;建议使用绝对路径(如 /var/log/myapp/app.log)以便统一运维与权限管理。
二 使用 INI 配置文件集中管理
- 将日志参数外置到 INI 配置文件(如 logging.conf)便于维护与复用。核心结构包含 [loggers] / [handlers] / [formatters] 三大节,示例如下:
[loggers]
keys=root,my_logger
[handlers]
keys=fileHandler,consoleHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=fileHandler,consoleHandler
[logger_my_logger]
level=DEBUG
handlers=fileHandler,consoleHandler
qualname=my_logger
propagate=0
[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=simpleFormatter
args=('/var/log/myapp/app.log', 'a')
[handler_consoleHandler]
class=StreamHandler
level=INFO
formatter=simpleFormatter
args=(sys.stdout,)
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S
import logging, logging.config
logging.config.fileConfig('/path/to/logging.conf')
logger = logging.getLogger('my_logger')
logger.info('started')
- 要点:
- class=FileHandler/StreamHandler 指定输出目标;args 中文件路径建议使用绝对路径,控制台使用 sys.stdout。
- 可按需扩展多个 Logger/Handler/Formatter,实现不同模块或级别的差异化输出。
三 按级别分文件与多进程安全
- 按级别分文件:为 INFO/ERROR 等分别创建 FileHandler,在 [handlers] 与 [loggers] 中对应绑定,实现“错误日志单独落盘、业务日志统一归档”。示例思路:定义 handler_infos/handler_errors,在 [logger_info]/[logger_error] 中分别指定,形成 info.log 与 error.log 的分流。
- 多进程安全:标准 FileHandler 在并发写入时可能出现日志交错/丢失。生产环境建议使用支持并发的 WatchedFileHandler(配合外部日志轮转)或第三方 ConcurrentLogHandler;若使用 systemd 管理进程,也可将日志交由 journald 并通过 SyslogHandler 写入,由系统统一轮转与采集。
四 日志轮转与保留策略
- 外部轮转(推荐):使用 logrotate 管理日志生命周期,示例配置 /etc/logrotate.d/myapp:
/var/log/myapp/*.log {
daily
rotate 30
missingok
compress
delaycompress
copytruncate
notifempty
create 0644 myapp myapp
}
- 说明:
- daily / rotate 30 表示按天轮转并保留 30 天;compress 启用压缩节省空间;copytruncate 适用于持续写入的文件句柄场景(避免重启应用);如应用支持 SIGHUP 或具备重新打开日志文件能力,可改用 postrotate 执行 kill -HUP 。
- 若采用 TimedRotatingFileHandler(如按天切分),务必设置 when=‘midnight’, backupCount=30 并配合 ConcurrentLogHandler 或外部轮转,避免并发写入冲突与文件句柄问题。
五 运行与运维要点
- 权限与目录:确保运行用户对日志目录(如 /var/log/myapp)具备写权限,目录属主/属组与权限建议设置为 myapp:myapp / 0755,避免因权限不足导致日志写入失败。
- 路径规范:代码中尽量使用绝对路径或基于 file 计算日志目录,减少因工作目录变化导致日志“找不到”的问题。
- 监控与告警:对磁盘空间设置阈值告警(如可用空间低于 10% 触发通知),并定期审计日志内容的关键错误与异常趋势,结合监控平台实现主动告警。