Ubuntu下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)。
logging.config实现高级配置(字典/文件配置)对于复杂项目,推荐使用字典配置或配置文件分离日志逻辑与代码,提升可维护性。
通过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)') # 文件和控制台均输出
使用.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')
两种方式均支持动态调整(如通过环境变量切换配置),避免硬编码。
使用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)
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。
集成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)
结构化日志(如JSON格式)便于日志收集系统(如ELK、Graylog)解析和分析。可通过以下方式实现:
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。
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"}
通过环境变量区分不同环境的日志配置(如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