Ubuntu下Python日志配置的常见方法
在Ubuntu系统中,Python日志配置主要通过内置的logging
模块实现,支持代码直接配置(快速测试)、配置文件配置(灵活维护)及第三方库扩展(简化操作)三种方式,以下是具体实现步骤:
通过logging.basicConfig()
快速设置日志级别、输出格式和目标,适合临时调试或简单项目。
import logging
# 配置日志:级别(DEBUG/INFO/WARNING/ERROR/CRITICAL)、格式、输出文件(追加模式)
logging.basicConfig(
level=logging.DEBUG, # 设置最低日志级别(低于此级别的日志不记录)
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', # 日志格式(时间+记录器名+级别+消息)
datefmt='%Y-%m-%d %H:%M:%S', # 时间格式
filename='app.log', # 日志文件路径(Ubuntu下默认在脚本同级目录)
filemode='a' # 文件模式:'a'(追加,默认)或'w'(覆盖)
)
# 获取当前模块的日志记录器(__name__为当前模块名,如"main")
logger = logging.getLogger(__name__)
# 记录不同级别的日志
logger.debug('Debug信息:用于排查问题的详细日志') # 仅在level=DEBUG时显示
logger.info('Info信息:程序正常运行的提示') # 如功能启动/完成
logger.warning('Warning信息:潜在问题提醒') # 如资源即将耗尽
logger.error('Error信息:程序错误(不影响运行)') # 如接口调用失败
logger.critical('Critical信息:严重错误(可能导致崩溃)') # 如系统崩溃
效果:日志会同时输出到app.log
文件和控制台(默认行为),内容如:
2025-10-01 12:00:00 - __main__ - INFO - Info信息:程序正常运行的提示
通过INI/YAML/JSON等配置文件分离日志配置与代码,便于团队协作和动态调整。以下以INI配置文件为例:
logging.conf
)在Ubuntu终端使用touch logging.conf
创建文件,内容如下:
[loggers]
keys=root,fileLogger # 定义两个记录器:root(默认)和fileLogger(自定义)
[handlers]
keys=consoleHandler,fileHandler # 定义两个处理器:控制台输出和文件输出
[formatters]
keys=simpleFormatter # 定义一种格式化器(日志输出格式)
# ===== 记录器配置 =====
[logger_root]
level=INFO # root记录器的最低级别(控制台输出)
handlers=consoleHandler # 关联控制台处理器
[logger_fileLogger]
level=DEBUG # 自定义记录器的最低级别(文件输出)
handlers=fileHandler # 关联文件处理器
qualname=fileLogger # 记录器名称(获取时用logging.getLogger("fileLogger"))
propagate=0 # 是否向父记录器传递日志(0=不传递,避免重复输出)
# ===== 处理器配置 =====
[handler_consoleHandler]
class=StreamHandler # 控制台处理器(输出到stdout)
level=INFO # 处理器处理的最低级别
formatter=simpleFormatter # 关联格式化器
args=(sys.stdout,) # 参数:标准输出流
[handler_fileHandler]
class=FileHandler # 文件处理器(输出到文件)
level=DEBUG # 处理器处理的最低级别
formatter=simpleFormatter # 关联格式化器
args=('app.log', 'a') # 参数:文件路径(app.log)、模式(追加)
# ===== 格式化器配置 =====
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s # 日志格式
datefmt=%Y-%m-%d %H:%M:%S # 时间格式
import logging
import logging.config
# 加载配置文件(需指定正确路径,如当前目录下的logging.conf)
logging.config.fileConfig('logging.conf')
# 获取自定义记录器(对应配置文件中的"fileLogger")
logger = logging.getLogger("fileLogger")
# 记录日志(仅符合fileLogger级别和处理器规则的日志会被输出)
logger.debug('Debug信息:会写入文件') # 写入app.log
logger.info('Info信息:会输出到控制台和文件') # 同时输出到控制台和文件
logger.warning('Warning信息:会输出到控制台和文件')
效果:
INFO
及以上级别日志(如Info信息:会输出到控制台和文件
);app.log
文件包含DEBUG
及以上级别日志(如Debug信息:会写入文件
)。使用loguru
库(需安装:pip install loguru
),无需复杂配置即可实现高级功能(如日志轮转、格式化、异常捕获)。
from loguru import logger
# 配置日志:输出到文件(app.log)、日志轮转(每天1个文件,保留7天)、格式化
logger.add("app.log",
rotation="daily", # 每天轮转
retention="7 days", # 保留7天
format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {message}", # 格式
level="DEBUG") # 最低级别
# 记录日志(无需获取记录器,直接使用logger)
logger.debug('Debug信息:自动写入文件')
logger.info('Info信息:自动输出到控制台和文件')
logger.error('Error信息:自动捕获异常堆栈')
效果:
app.log
,并每天生成新文件(如app.log.2025-10-01
);from loguru import logger
@logger.catch # 装饰器:自动捕获函数内的异常并记录日志
def divide(a, b):
return a / b
divide(10, 0) # 触发ZeroDivisionError,日志会记录异常堆栈
效果:
app.log
中会记录完整的异常信息,包括错误类型、堆栈跟踪和触发位置。
日志文件长期运行会占用大量磁盘空间,需通过轮转(按大小/时间分割)解决。以下是两种常用方式:
import logging
from logging.handlers import TimedRotatingFileHandler
# 创建自定义记录器
logger = logging.getLogger("rotating_logger")
logger.setLevel(logging.DEBUG)
# 创建定时轮转处理器(每天午夜轮转,保留30天)
handler = TimedRotatingFileHandler(
filename='app_rotating.log', # 日志文件路径
when='midnight', # 轮转时间(每天午夜)
interval=1, # 间隔天数
backupCount=30, # 保留天数
encoding='utf-8'
)
handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
# 添加处理器到记录器
logger.addHandler(handler)
# 记录日志
logger.info('This log will be rotated daily.')
在logging.conf
中添加以下配置:
[handler_rotatingFileHandler]
class=logging.handlers.RotatingFileHandler # 按大小轮转的文件处理器
level=DEBUG
formatter=simpleFormatter
args=('app_rotating.log', 'a', 1024*1024, 5) # 参数:文件路径、模式、最大大小(1MB)、备份数量
效果:当日志文件达到1MB时,自动创建新文件(如app_rotating.log.1
),保留最近5个备份。
/var/log/python_app/
)存在且有写入权限(可通过sudo mkdir -p /var/log/python_app
创建目录,sudo chown $USER:$USER /var/log/python_app
修改权限)。%(LOG_DIR)s
),需通过os.environ
设置(如os.environ['LOG_DIR'] = '/var/log/python_app'
)。cron
任务定期清理旧日志(如每天凌晨删除7天前的日志):# 编辑cron任务(crontab -e)
0 0 * * * find /var/log/python_app -name "*.log" -mtime +7 -delete
以上方法覆盖了Ubuntu下Python日志配置的常见场景,可根据项目需求选择合适的方式(简单项目用代码配置,复杂项目用配置文件,进阶项目用loguru
)。