首页主机资讯Debian上Python日志如何管理

Debian上Python日志如何管理

时间2025-12-19 14:40:04发布访客分类主机资讯浏览289
导读: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/Dmidnight/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
如何在Debian上使用Python GUI Debian如何高效编译Java程序

游客 回复需填写必要信息