Debian上Python日志如何管理
导读:Debian上Python日志管理实践 一 基础配置与多处理器输出 使用 Python 标准库 logging,通过 basicConfig 快速配置,或用 FileHandler/StreamHandler 组合实现同时输出到文件与控制...
Debian上Python日志管理实践
一 基础配置与多处理器输出
- 使用 Python 标准库 logging,通过 basicConfig 快速配置,或用 FileHandler/StreamHandler 组合实现同时输出到文件与控制台。
- 推荐格式包含时间、级别、模块与函数,便于检索与排错。
- 示例要点:
- 控制台输出 INFO 及以上,文件输出 DEBUG 及以上。
- 使用 %(asctime)s、%(levelname)s、%(name)s、%(funcName)s 等字段。
import logging LOG_FMT = '%(asctime)s [%(levelname)s] %(name)s.%(funcName)s:%(lineno)d - %(message)s' LOG_DATEFMT = '%Y-%m-%d %H:%M:%S' logging.basicConfig( level=logging.DEBUG, format=LOG_FMT, datefmt=LOG_DATEFMT, handlers=[ logging.FileHandler('app.log', encoding='utf-8'), logging.StreamHandler() ] ) logger = logging.getLogger(__name__) logger.debug('调试信息') logger.info('服务启动')
二 日志轮转与保留策略
- 按大小轮转:使用 RotatingFileHandler,设定单文件上限与备份数量,避免单日志过大。
- 按时间轮转:使用 TimedRotatingFileHandler,可按 S/M/H/D 或 midnight/W0–W6 切分,并保留最近 N 个归档。
- 示例要点:
- 每 10 MB 轮转,保留 5 个备份。
- 每天 00:00 切分,保留 30 天。
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler # 按大小轮转 size_handler = RotatingFileHandler('app.log', maxBytes=10*1024*1024, backupCount=5, encoding='utf-8') size_handler.setFormatter(logging.Formatter(LOG_FMT, LOG_DATEFMT)) # 按时间轮转 time_handler = TimedRotatingFileHandler( 'app_time.log', when='midnight', interval=1, backupCount=30, encoding='utf-8' ) time_handler.setFormatter(logging.Formatter(LOG_FMT, LOG_DATEFMT)) logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) logger.addHandler(size_handler) logger.addHandler(time_handler)
三 系统日志与 journald 集成
- 写入系统日志:使用 SysLogHandler(address=‘/dev/log’) 将日志发送到本地 rsyslog,再由 journald 统一管理;可指定 facility(如 LOG_LOCAL0)做分类与过滤。
- 查看方式:
- 使用 journalctl 检索与过滤(如按服务、时间范围、优先级)。
- 若需按文件落盘再由系统轮转,可用 logrotate 管理应用日志文件。
import logging from logging.handlers import SysLogHandler logger = logging.getLogger('myapp') logger.setLevel(logging.INFO) sys_handler = SysLogHandler(address='/dev/log', facility=SysLogHandler.LOG_LOCAL0) sys_handler.setFormatter(logging.Formatter('%(name)s[%(process)d]: %(message)s')) logger.addHandler(sys_handler) logger.info('通过 syslog 写入')# 查看全部日志 journalctl # 按服务查看 journalctl -u myapp.service # 按时间范围查看 journalctl --since "2025-01-01" --until "2025-01-31"# /etc/logrotate.d/myapp /var/log/myapp.log { weekly rotate 8 compress delaycompress missingok notifempty }
四 配置管理与最佳实践
- 配置方式:
- 使用 dictConfig 集中管理日志器、处理器、格式化器,便于不同环境复用与调整。
- 使用 fileConfig 读取 INI 风格配置文件,适合运维交付与版本控制。
- 使用 YAML 编写配置,配合 PyYAML 转为字典后交给 dictConfig,可读性更强。
- 实践建议:
- 避免使用 root logger 直接打业务日志,按模块命名(如 name),分层管理。
- 生产环境建议将控制台级别设为 INFO/WARNING,文件级别设为 DEBUG 并配合轮转。
- 在 systemd 服务中,优先写入 stdout/stderr,由 journald 收集;如需文件日志,确保目录可写并设置 UMask。
- 关键业务或异常使用 logger.exception 或装饰器自动捕获堆栈,减少漏记。
# dictConfig 示例 import logging.config LOG_CFG = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'default': { 'format': LOG_FMT, 'datefmt': LOG_DATEFMT} , } , 'handlers': { 'console': { 'class': 'logging.StreamHandler', 'level': 'INFO', 'formatter': 'default', } , 'file': { 'class': 'logging.handlers.TimedRotatingFileHandler', 'level': 'DEBUG', 'formatter': 'default', 'when': 'D', 'interval': 1, 'backupCount': 30, 'filename': 'app.log', 'encoding': 'utf-8', } , } , 'loggers': { '': { 'handlers': ['console', 'file'], 'level': 'DEBUG', 'propagate': True} , } , } logging.config.dictConfig(LOG_CFG) logger = logging.getLogger(__name__)# fileConfig 示例:logging.conf [loggers] keys=root,myapp [handlers] keys=consoleHandler,fileHandler [formatters] keys=simpleFormatter [logger_root] level=DEBUG handlers=consoleHandler [logger_myapp] level=DEBUG handlers=fileHandler qualname=myapp propagate=0 [handler_consoleHandler] class=StreamHandler level=INFO formatter=simpleFormatter args=(sys.stdout,) [handler_fileHandler] class=handlers.TimedRotatingFileHandler level=DEBUG formatter=simpleFormatter args=('app.log', 'a', 1, 30) kwargs={ 'when':'D', 'backupCount':30, 'encoding':'utf-8'} [formatter_simpleFormatter] format=%(asctime)s [%(levelname)s] %(name)s.%(funcName)s:%(lineno)d - %(message)s datefmt=%Y-%m-%d %H:%M:%S# YAML 示例(需 PyYAML) version: 1 disable_existing_loggers: false formatters: default: format: '%(asctime)s [%(levelname)s] %(name)s.%(funcName)s:%(lineno)d - %(message)s' datefmt: '%Y-%m-%d %H:%M:%S' handlers: console: class: logging.StreamHandler level: INFO formatter: default file: class: logging.handlers.TimedRotatingFileHandler level: DEBUG formatter: default when: D interval: 1 backupCount: 30 filename: app.log encoding: utf-8 loggers: '': handlers: [console, file] level: DEBUG propagate: true
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Debian上Python日志如何管理
本文地址: https://pptw.com/jishu/776264.html
