CentOS Python日志处理技巧有哪些
CentOS环境下Python日志处理实用技巧
1. 使用Python内置logging模块基础配置
Python的logging模块是日志处理的核心工具,支持多级别(DEBUG、INFO、WARNING、ERROR、CRITICAL)、多处理器(控制台、文件等)和格式化输出。基础配置可通过basicConfig快速实现,例如:
import logging
logging.basicConfig(
    level=logging.INFO,  # 设置日志级别(生产环境建议用WARNING/ERROR)
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',  # 包含时间、记录器名称、级别和消息
    handlers=[logging.FileHandler('app.log'), logging.StreamHandler()]  # 同时输出到文件和控制台
)
logger = logging.getLogger(__name__)  # 创建记录器
logger.info('Application started')  # 记录日志
这种方式适合简单项目,快速启动日志记录。
2. 高级日志轮转:控制日志文件大小和数量
当日志文件过大时,需通过轮转压缩旧日志,避免占用过多磁盘空间。常用两种方式:
- 按大小轮转:使用
RotatingFileHandler,当日志文件达到指定大小(如10MB)时,自动创建新文件并保留指定数量(如5个)的备份:from logging.handlers import RotatingFileHandler rotating_handler = RotatingFileHandler( '/var/log/myapp/app.log', maxBytes=10*1024*1024, # 10MB backupCount=5 # 保留5个备份 ) rotating_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')) logger.addHandler(rotating_handler) - 按时间轮转:使用
TimedRotatingFileHandler,按时间间隔(如每天、每小时)轮转日志,适合长期运行的服务:两种方式均可结合from logging.handlers import TimedRotatingFileHandler timed_handler = TimedRotatingFileHandler( '/var/log/myapp/app.log', when='midnight', # 每天午夜轮转 interval=1, # 每天一次 backupCount=7 # 保留7天的日志 ) timed_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')) logger.addHandler(timed_handler)compress参数(如RotatingFileHandler的compression='zip')自动压缩旧日志。 
3. 日志过滤:精准控制日志输出内容
通过自定义过滤器,可只记录符合特定条件的日志(如包含某关键词、来自某模块的日志),减少无关日志干扰。示例如下:
class KeywordFilter(logging.Filter):
    def filter(self, record):
        return 'important' in record.getMessage()  # 只记录包含"important"的消息
logger.addFilter(KeywordFilter())  # 添加过滤器
logger.info('This is an important message')  # 会被记录
logger.info('This is a normal message')  # 不会被记录
过滤器可添加到单个处理器(如file_handler.addFilter())或整个记录器,实现更细粒度的日志控制。
4. 输出到系统日志(syslog):集成系统日志管理
若需将Python日志与CentOS系统日志(如/var/log/messages)整合,可使用SysLogHandler,将日志发送到系统日志服务:
from logging.handlers import SysLogHandler
syslog_handler = SysLogHandler(address='/dev/log')  # CentOS系统日志默认地址
syslog_handler.setLevel(logging.WARNING)  # 只发送WARNING及以上级别日志
syslog_handler.setFormatter(logging.Formatter('%(name)s - %(levelname)s - %(message)s'))
logger.addHandler(syslog_handler)
logger.warning('System-level warning occurred')  # 会出现在系统日志中
这种方式适合需要统一管理应用日志和系统日志的场景。
5. 结合logrotate工具:自动化日志管理
虽然logging模块支持轮转,但logrotate(CentOS自带)能更灵活地管理日志文件(如按时间、大小轮转,压缩,删除旧日志),并支持定时任务(通过cron)。示例如下:
创建/etc/logrotate.d/myapp配置文件:
/var/log/myapp/*.log {
    
    daily  # 每天轮转
    rotate 7  # 保留7个备份
    compress  # 压缩旧日志(如.gz)
    missingok  # 文件不存在时不报错
    notifempty  # 文件为空时不轮转
    sharedscripts  # 所有日志轮转完成后执行脚本
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2>
     /dev/null` 2>
 /dev/null || true  # 重启日志服务(如syslog)
    endscript
}
logrotate会自动处理日志轮转,无需修改Python代码。
6. 使用第三方库简化日志处理:Loguru
Loguru是第三方日志库,提供了更简洁的API和更强大的功能(如自动格式化、彩色日志、异常追踪),适合快速开发。示例如下:
from loguru import logger
logger.add("app.log", rotation="500 MB", retention="30 days", compression="zip")  # 自动轮转(500MB)、保留30天、压缩
logger.info("User logged in successfully")  # 自动添加时间、级别等信息
try:
    1 / 0
except Exception as e:
    logger.exception("An error occurred")  # 自动记录异常堆栈
Loguru无需复杂配置,适合中小项目快速实现日志功能。
7. 日志级别环境区分:适配开发与生产
根据环境(开发、测试、生产)设置不同日志级别,避免生产环境日志过多影响性能,同时保证开发环境有足够的调试信息。示例如下:
import os
import logging
# 根据环境变量设置日志级别
env = os.getenv('ENVIRONMENT', 'development').lower()
log_level = logging.DEBUG if env == 'development' else logging.WARNING
logging.basicConfig(
    level=log_level,
    format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
logger.debug('Debug message (only in development)')  # 开发环境可见,生产环境不可见
logger.warning('Warning message (visible in all environments)')
通过ENVIRONMENT变量控制日志级别,灵活适配不同环境。
8. 结构化日志:便于分析与可视化
使用结构化日志(如JSON格式),可将日志信息转换为键值对,方便日志分析工具(如ELK Stack、Grafana)解析和可视化。示例如下:
import logging
import json
class JsonFormatter(logging.Formatter):
    def format(self, record):
        log_entry = {
            'timestamp': self.formatTime(record),
            'level': record.levelname,
            'message': record.getMessage(),
            'module': record.module,
            'function': record.funcName,
            'line': record.lineno
        }
        return json.dumps(log_entry)
logger = logging.getLogger(__name__)
handler = logging.FileHandler('/var/log/myapp/app.json')
handler.setFormatter(JsonFormatter())
logger.addHandler(handler)
logger.info('User logged in', extra={
'user_id': 123}
    )  # 输出JSON格式日志
结构化日志适合大规模系统的日志分析和监控。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: CentOS Python日志处理技巧有哪些
本文地址: https://pptw.com/jishu/741990.html
