ubuntu

Ubuntu下Python日志管理技巧

小樊
57
2025-08-29 18:39:52
栏目: 编程语言

Ubuntu下Python日志管理技巧

1. 使用Python内置logging模块实现基础日志管理

logging是Python标准库中的核心日志工具,支持分级记录(DEBUG/INFO/WARNING/ERROR/CRITICAL)、格式化输出多处理器(文件/控制台)。基础配置示例如下:

import logging
logging.basicConfig(
    level=logging.INFO,  # 设置最低日志级别
    format='%(asctime)s - %(levelname)s - %(message)s',  # 定义日志格式(时间+级别+消息)
    filename='app.log',  # 输出到文件
    filemode='a'  # 追加模式('w'为覆盖)
)
logging.info('Application started')  # 记录INFO级别日志

通过调整level参数,可控制输出的日志级别(如生产环境设为WARNING,开发环境设为DEBUG)。

2. 利用logging.config实现高级配置(字典/文件配置)

对于复杂项目,推荐使用字典配置配置文件分离日志逻辑与代码,提升可维护性。

2.1 字典配置(推荐)

通过logging.config.dictConfig()加载字典配置,支持多日志记录器多处理器(文件+控制台)、格式化器等高级功能:

import logging.config

log_config = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'simple': {'format': '%(asctime)s - %(levelname)s - %(message)s'},
        'detailed': {'format': '%(asctime)s - %(name)s - %(levelname)s - %(module)s - %(message)s'}
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'level': 'DEBUG',
            'formatter': 'simple',
            'stream': 'ext://sys.stdout'
        },
        'file': {
            'class': 'logging.FileHandler',
            'level': 'INFO',
            'formatter': 'detailed',
            'filename': 'app.log',
            'mode': 'a'
        }
    },
    'root': {
        'level': 'DEBUG',
        'handlers': ['console', 'file']
    }
}

logging.config.dictConfig(log_config)
logger = logging.getLogger(__name__)
logger.debug('Debug message (console only)')  # 仅控制台输出
logger.info('Info message (file + console)')  # 文件和控制台均输出

2.2 配置文件方式

使用.ini格式配置文件(如logging.conf),通过logging.config.fileConfig()加载:

[loggers]
keys=root,sampleLogger

[handlers]
keys=consoleHandler,fileHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler

[logger_sampleLogger]
level=INFO
handlers=consoleHandler,fileHandler
qualname=sampleLogger
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)

[handler_fileHandler]
class=FileHandler
level=INFO
formatter=simpleFormatter
args=('app.log', 'a')

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S

代码中加载配置:

import logging
import logging.config

logging.config.fileConfig('logging.conf')
logger = logging.getLogger('sampleLogger')
logger.info('This is an info message from config file')

两种方式均支持动态调整(如通过环境变量切换配置),避免硬编码。

3. 日志轮转(避免文件过大)

使用logrotate工具自动切割、压缩日志文件,防止日志占满磁盘。Ubuntu下安装与配置步骤:

# 安装logrotate
sudo apt-get install logrotate

# 创建自定义配置文件(/etc/logrotate.d/python_app)
sudo nano /etc/logrotate.d/python_app

配置内容示例(针对/var/log/python/*.log文件):

/var/log/python/*.log {
    daily  # 每天轮转
    rotate 7  # 保留7份
    compress  # 压缩旧日志(gzip)
    missingok  # 文件不存在时不报错
    notifempty  # 文件为空时不轮转
    copytruncate  # 复制原文件后清空(避免重启应用)
}

手动触发轮转测试:

sudo logrotate -f /etc/logrotate.d/python_app

也可通过logging.handlers.RotatingFileHandler(内置模块)实现程序内轮转:

from logging.handlers import RotatingFileHandler

handler = RotatingFileHandler(
    'app.log', maxBytes=10*1024*1024, backupCount=5  # 10MB切片,保留5份
)
logging.getLogger().addHandler(handler)

4. 第三方日志库增强功能

4.1 Loguru(简化日志操作)

Loguru是一个第三方库,提供简洁API自动轮转彩色控制台输出、**结构化日志(JSON)**等功能,适合快速开发:

from loguru import logger

# 基础使用(自动输出到控制台+文件)
logger.add("app.log", rotation="10 MB", retention="7 days", level="DEBUG")
logger.debug("Debug message")
logger.info("Info message with exception", exc_info=True)  # 自动捕获异常堆栈

# 多环境配置(参考搜索结果中的config/logging_config.py)

安装:pip install loguru

4.2 Sentry(错误监控)

集成Sentry可实时捕获并上报Python应用中的错误,帮助快速定位问题:

import sentry_sdk
from sentry_sdk.integrations.logging import LoggingIntegration

# 初始化Sentry(替换为你的DSN)
sentry_sdk.init(
    dsn="https://your-dsn@sentry.io/12345",
    integrations=[LoggingIntegration()],  # 关联logging模块
    traces_sample_rate=1.0  # 采样率(1.0表示100%)
)

# 记录错误(自动上报到Sentry)
logger = logging.getLogger(__name__)
try:
    1 / 0
except Exception as e:
    logger.error("Division by zero error", exc_info=True)

5. 结构化日志(适配ELK等分析系统)

结构化日志(如JSON格式)便于日志收集系统(如ELK、Graylog)解析和分析。可通过以下方式实现:

5.1 使用python-json-logger

from pythonjsonlogger import jsonlogger
import logging

logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = jsonlogger.JsonFormatter('%(asctime)s %(name)s %(levelname)s %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.INFO)

logger.info("Structured log example", extra={'user_id': 123, 'action': 'login'})
# 输出:{"asctime": "2025-08-29 10:00:00", "name": "root", "levelname": "INFO", "message": "Structured log example", "user_id": 123, "action": "login"}

安装:pip install python-json-logger

5.2 Loguru的JSON格式化

from loguru import logger

logger.add("app.json", format="{message}", serialize=True, level="INFO")  # serialize=True生成JSON
logger.info("This is a structured log", user_id=123, action="login")
# 输出:{"message": "This is a structured log", "user_id": 123, "action": "login"}

6. 多环境日志配置(开发/测试/生产)

通过环境变量区分不同环境的日志配置(如APP_ENV=dev/test/prod),实现差异化日志策略

# config/logging_config.py
import os

ENV = os.getenv("APP_ENV", "dev")  # 默认开发环境
LOG_CONFIG = {
    "dev": {
        "level": "DEBUG",
        "sink": "logs/app_dev.log",
        "rotation": "10 MB",
        "colorize": True,
        "serialize": False
    },
    "test": {
        "level": "INFO",
        "sink": "logs/app_test.log",
        "rotation": "5 MB",
        "serialize": True,  # 测试环境用JSON便于分析
        "colorize": False
    },
    "prod": {
        "level": "WARNING",
        "sink": "/var/log/python/app_prod.log",
        "rotation": "1 day",
        "serialize": True,
        "colorize": False
    }
}

current_config = LOG_CONFIG[ENV]

运行时设置环境变量:

# 开发环境
APP_ENV=dev python main.py

# 生产环境
APP_ENV=prod python main.py

0
看了该问题的人还看了