Python在Ubuntu上的日志管理指南
在Ubuntu系统中,Python日志管理可通过内置模块、第三方库及系统工具结合实现,覆盖日志记录、轮转、分析和可视化全流程。以下是具体方法:
logging
是Python标准库的核心日志工具,支持分级记录(DEBUG/INFO/WARNING/ERROR/CRITICAL)、格式定制及多输出目标(控制台/文件)。
通过basicConfig
快速设置日志级别、格式和文件输出,适合简单场景:
import logging
logging.basicConfig(
level=logging.DEBUG, # 设置最低日志级别(低于此级别的日志将被忽略)
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', # 包含时间、模块名、级别和消息
datefmt='%Y-%m-%d %H:%M:%S', # 时间格式
filename='app.log', # 日志文件路径
filemode='a' # 文件模式:'a'追加(默认),'w'覆盖
)
logger = logging.getLogger(__name__) # 获取当前模块的日志记录器
logger.debug('Debug message') # 记录调试信息
logger.info('Info message') # 记录常规信息
logger.warning('Warning message') # 记录警告信息
logger.error('Error message') # 记录错误信息
logger.critical('Critical message') # 记录严重错误信息
通过JSON/YAML/INI配置文件分离日志配置与业务代码,提升可维护性。以JSON为例:
// config.json
{
"version": 1,
"formatters": {
"standard": {
"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
"datefmt": "%Y-%m-%d %H:%M:%S"
}
},
"handlers": {
"file": {
"class": "logging.FileHandler",
"filename": "app.log",
"level": "DEBUG",
"formatter": "standard",
"mode": "a"
}
},
"loggers": {
"": { // 根记录器
"handlers": ["file"],
"level": "DEBUG",
"propagate": true // 是否向上传播到父记录器
}
}
}
Python代码加载配置:
import logging
import json
with open('config.json', 'r') as f:
config = json.load(f)
logging.config.dictConfig(config) # 加载字典配置
logger = logging.getLogger(__name__)
将日志同时输出到控制台和文件,满足不同场景需求:
import logging
# 创建控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_formatter = logging.Formatter('%(levelname)s - %(message)s')
console_handler.setFormatter(console_formatter)
# 创建文件处理器
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.DEBUG)
file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(file_formatter)
# 获取记录器并添加处理器
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(console_handler)
logger.addHandler(file_handler)
Loguru简化了日志配置,支持自动轮转、压缩、彩色输出等功能,无需修改配置文件:
from loguru import logger
# 添加文件处理器(自动轮转500MB,保留5个备份,压缩)
logger.add("app.log", rotation="500 MB", retention=5, compression="zip")
logger.debug('Debug message')
logger.info('Info message')
logger.error('Error message')
Sentry是实时错误跟踪平台,可捕获Python异常并发送到云端,帮助快速定位问题:
import sentry_sdk
from sentry_sdk.integrations.logging import LoggingIntegration
from logging import getLogger, ERROR
# 初始化Sentry(替换为你的DSN)
sentry_sdk.init(
dsn="YOUR_SENTRY_DSN",
integrations=[LoggingIntegration(level=ERROR, event_level=ERROR)] # 将ERROR及以上级别日志发送到Sentry
)
logger = getLogger(__name__)
try:
1 / 0 # 故意引发错误
except Exception as e:
logger.error("Division by zero error", exc_info=True) # 记录错误堆栈
sentry_sdk.capture_exception(e) # 发送到Sentry
日志文件过大时,需通过轮转(分割为多个小文件)避免占用过多磁盘空间。常用工具包括Python内置的RotatingFileHandler
/TimedRotatingFileHandler
和Ubuntu的logrotate
。
RotatingFileHandler
):from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler('app.log', maxBytes=10*1024*1024, backupCount=3) # 单个文件最大10MB,保留3个备份
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
TimedRotatingFileHandler
):from logging.handlers import TimedRotatingFileHandler
handler = TimedRotatingFileHandler('app.log', when='midnight', interval=1, backupCount=7) # 每天午夜轮转,保留7天
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logrotate
是Ubuntu系统自带的日志轮转工具,支持定时任务、压缩、删除旧日志等功能。
sudo apt-get install logrotate
sudo nano /etc/logrotate.d/python_app
内容示例(轮转/var/log/python/app.log
,每天一次,保留7天,压缩):/var/log/python/app.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate # 不重启应用的情况下清空原日志文件
}
sudo logrotate -f /etc/logrotate.d/python_app
systemd journal
是Ubuntu的日志管理服务,可收集、存储和查询系统及应用日志。Python应用可通过syslog
模块将日志发送到journal:
import syslog
# 发送日志到systemd journal(优先级为LOG_INFO,标签为'python_app')
syslog.syslog(syslog.LOG_INFO, 'This is a log message from Python')
# 查看journal中的日志
import subprocess
subprocess.run(['journalctl', '-f', '-t', 'python_app']) # 实时查看标签为'python_app'的日志
rsyslog
是Ubuntu的日志处理工具,可将Python日志转发到远程服务器或特定文件:
sudo nano /etc/rsyslog.d/python.conf
内容示例(将/var/log/python/app.log
转发到远程服务器192.168.1.100
的/var/log/remote/python.log
):local0.* @192.168.1.100:514 # UDP转发
# local0.* @@192.168.1.100:514 # TCP转发(更可靠)
sudo systemctl restart rsyslog
ELK是强大的日志分析平台,适合大规模日志的存储、搜索和可视化。
# 添加Elastic APT仓库
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
sudo apt-get update
# 安装组件
sudo apt-get install elasticsearch logstash kibana
# 启动服务
sudo systemctl start elasticsearch
sudo systemctl start kibana
/etc/logstash/conf.d/python.conf
:input {
file {
path => "/var/log/python/app.log"
start_position => "beginning"
sincedb_path => "/dev/null" # 首次运行时忽略sincedb文件
}
}
filter {
# 可选:添加过滤器解析日志(如JSON格式)
# json {
# source => "message"
# }
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "python-logs-%{+YYYY.MM.dd}" # 按日期创建索引
}
stdout { codec => rubydebug } # 控制台输出(调试用)
}
sudo systemctl start logstash
http://localhost:5601
),配置索引模式(如python-logs-*
),即可通过可视化界面分析日志。通过以上方法,可在Ubuntu系统中实现Python日志的灵活记录、自动管理和深度分析,满足从开发调试到生产监控的不同需求。