Ubuntu系统中Python日志配置方法
logging模块的基本配置(快速上手)Python标准库的logging模块提供了基础配置能力,适合简单场景。通过basicConfig函数可快速设置日志级别、输出格式、文件路径等参数。
示例代码:
import logging
# 配置日志:DEBUG级别、自定义格式、输出到app.log(追加模式)
logging.basicConfig(
level=logging.DEBUG, # 日志级别(DEBUG/INFO/WARNING/ERROR/CRITICAL)
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', # 日志格式(时间+记录器名+级别+消息)
datefmt='%Y-%m-%d %H:%M:%S', # 时间格式
filename='app.log', # 日志文件路径(Ubuntu下可指定绝对路径,如/home/user/app.log)
filemode='a' # 文件模式:'a'(追加,默认)或'w'(覆盖)
)
# 获取记录器(默认使用根记录器)
logger = logging.getLogger(__name__) # __name__为当前模块名,便于区分不同模块的日志
# 记录不同级别日志
logger.debug('Debug信息:程序启动') # 仅当level=DEBUG时输出
logger.info('Info信息:用户登录成功') # 常规运行信息
logger.warning('Warning信息:磁盘空间不足') # 潜在问题预警
logger.error('Error信息:数据库连接失败') # 运行时错误
logger.critical('Critical信息:系统崩溃') # 严重错误(需立即处理)
说明:
DEBUG→INFO→WARNING→ERROR→CRITICAL,设置level后,低于该级别的日志不会输出。filename参数指定日志文件路径(如/var/log/myapp/app.log),需确保Python进程对该路径有写入权限(可通过chmod命令修改权限)。通过配置文件(如INI、JSON、YAML)管理日志配置,避免硬编码,方便修改无需改动代码。以下以INI格式为例(Ubuntu下常用):
logging.conf)[loggers]
keys=root # 定义根记录器(必选)
[handlers]
keys=consoleHandler,fileHandler # 定义处理器(控制台+文件)
[formatters]
keys=simpleFormatter # 定义格式化器(统一日志格式)
# 根记录器配置:关联处理器
[logger_root]
level=DEBUG # 根记录器级别
handlers=consoleHandler,fileHandler # 关联的处理器列表
# 控制台处理器:输出到终端
[handler_consoleHandler]
class=StreamHandler # 处理器类(StreamHandler输出到流,如stdout/stderr)
level=DEBUG # 处理器级别(可单独设置,低于根记录器则生效)
formatter=simpleFormatter # 关联的格式化器
args=(sys.stdout,) # 参数:输出到标准输出(控制台)
# 文件处理器:输出到文件(带轮转)
[handler_fileHandler]
class=logging.handlers.RotatingFileHandler # 文件处理器(支持轮转)
level=DEBUG
formatter=simpleFormatter
args=('app.log', 'a', 1024*1024, 3) # 参数:文件名、模式(追加)、最大大小(1MB)、备份数量(保留3个旧文件)
# 格式化器:定义日志输出格式
[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')
# 获取记录器(继承根记录器配置)
logger = logging.getLogger(__name__)
# 记录日志(遵循配置文件的规则)
logger.info('程序启动(配置文件模式)')
logger.error('发生错误(将输出到控制台和文件)')
说明:
RotatingFileHandler实现了日志轮转(当文件达到指定大小时,自动创建新文件并保留指定数量的旧文件),避免日志文件过大。args参数需根据处理器类调整(如FileHandler只需文件名,RotatingFileHandler需额外指定大小和备份数量)。日志文件长期积累会占用大量磁盘空间,需通过**轮转(Rotation)**机制自动管理。logging模块提供了两种轮转处理器:
RotatingFileHandler:按文件大小轮转(如每1MB一个文件,保留3个)。TimedRotatingFileHandler:按时间轮转(如每天、每小时生成一个新文件)。TimedRotatingFileHandler)import logging
from logging.handlers import TimedRotatingFileHandler
# 创建记录器
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
# 创建文件处理器(按天轮转,保留7天)
handler = TimedRotatingFileHandler(
filename='/var/log/myapp/app.log', # 日志文件路径
when='midnight', # 轮转时间(每天午夜)
interval=1, # 间隔(1天)
backupCount=7, # 保留旧文件数量(7天)
encoding='utf-8' # 文件编码(避免中文乱码)
)
# 设置格式化器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
# 添加处理器到记录器
logger.addHandler(handler)
# 记录日志
logger.info('这是一条按天轮转的日志')
说明:
when参数指定轮转时间单位(midnight=午夜、S=秒、M=分钟、H=小时、D=天、W0-W6=周一到周日)。/var/log/目录下(系统日志默认路径),并通过crontab或logrotate工具定期清理旧日志(如删除超过30天的日志)。若内置logging模块的配置过于复杂,可使用第三方库Loguru(更简洁的API)。
pip install loguru
from loguru import logger
# 配置日志:输出到控制台和文件(自动轮转,保留10个文件)
logger.add("app.log", rotation="10 MB", level="DEBUG", format="{time} - {level} - {message}", enqueue=True)
# 记录日志(无需获取记录器,直接调用logger)
logger.debug("Debug信息")
logger.info("Info信息")
logger.error("Error信息")
说明:
logger.add()方法用于添加日志处理器,支持自动轮转(rotation参数)、日志过滤(filter参数)、异步记录(enqueue参数)等功能。logging模块(更稳定、可扩展)。/var/log/目录需用sudo chmod 777 /var/log/myapp修改权限,或使用用户目录下的路径如~/logs/app.log)。INFO或WARNING(避免过多调试日志影响性能),开发环境设置为DEBUG(便于排查问题)。%(asctime)s(时间)、%(name)s(记录器名)、%(levelname)s(级别)、%(message)s(消息)等关键信息,便于后续分析。