Ubuntu下Python日志配置设置方法

作者:技术拾光

时间:2026-08-14

浏览:645

在Ubuntu下配置Python日志有三种方式:基础代码配置(logging.basicConfig)、配置文件(INI/YAML)管理和第三方库loguru,均可实现日志级别、格式、文件输出、文件轮转及动态调整,支持按大小或时间轮转,可同时输出到控制台和文件,满足开发调试与生产运维需求。

文章目录

在 Ubuntu 环境中配置 Python 日志,常见方式主要有三种:直接在代码中配置、通过配置文件集中管理,以及使用第三方库快速完成设置。下面将围绕这三种方案展开说明,并结合日志轮转与 Ubuntu 下的常见问题进行整理。

Ubuntu下Python日志配置设置方法

一、基础代码配置

如果只是进行快速测试,或者项目结构比较简单,直接使用 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信息:程序正常运行的提示。其中,filemode='a' 表示追加写入;如果希望每次启动程序时覆盖旧日志,可以改为 'w'。

二、配置文件管理

当项目规模增大后,把日志规则直接写在代码中会降低维护效率。此时可以使用配置文件,例如 INI、YAML 或 JSON,将日志配置与业务代码分离,便于团队协作和后期调整。下面以常见的 INI 配置方式为例。

1. 创建配置文件

可以先通过 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  # 时间格式

2. 在代码中加载配置文件

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 及以上级别的日志,而 app.log 中会保存 DEBUG 及以上级别的全部内容。使用配置文件的优势在于,无需修改代码即可调整日志级别、输出位置和显示格式。

三、使用第三方库简化配置

如果希望进一步减少配置步骤,loguru 是常用的第三方日志库。安装命令为 pip install loguru,安装完成后,可以更简洁地实现日志输出、轮转、格式化和异常捕获等功能。

1. 基础配置示例

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信息:自动捕获异常堆栈')

通过一行 logger.add,即可完成文件输出、日志轮转和格式设置。默认情况下,控制台还会显示彩色日志输出,便于查看。

2. 异常捕获示例

from loguru import logger

@logger.catch  # 装饰器:自动捕获函数内的异常并记录日志
def divide(a, b):
    return a / b

divide(10, 0)  # 触发ZeroDivisionError,日志会记录异常堆栈

程序运行后,app.log 会记录完整的异常信息,包括错误类型、堆栈跟踪以及触发位置。这种方式可以减少手动编写异常日志代码的工作量。

四、日志轮转管理

对于长期运行的服务,日志文件会持续增长,如果不进行处理,可能会占用大量磁盘空间。日志轮转的作用,就是按照时间或文件大小自动拆分日志文件,便于管理和清理。

1. 代码配置轮转日志

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.')

配置完成后,每天午夜系统会自动将当前日志文件重命名为类似 app_rotating.log.2025-10-01 的形式,并创建新的日志文件继续写入。超过保留期限的历史日志会自动删除。

2. 配置文件实现按大小轮转

如果使用配置文件方式管理日志,也可以在 logging.conf 中加入按大小轮转的处理器:

[handler_rotatingFileHandler]
class=logging.handlers.RotatingFileHandler  # 按大小轮转的文件处理器
level=DEBUG
formatter=simpleFormatter
args=('app_rotating.log', 'a', 1024*1024, 5)  # 参数:文件路径、模式、最大大小(1MB)、备份数量

当 app_rotating.log 达到 1MB 时,系统会自动重命名旧文件并创建新的日志文件,最多保留 5 个备份文件,例如 app_rotating.log.1、app_rotating.log.2 等。

五、Ubuntu 下的注意事项

  1. 文件路径权限:如果日志文件保存到 /var/log/python_app/ 这类系统目录,需要提前创建目录并授予写权限。例如:sudo mkdir -p /var/log/python_app,再执行 sudo chown $USER:$USER /var/log/python_app。
  2. 环境变量设置:如果配置文件中使用了类似 %(LOG_DIR)s 的占位符,需要在代码中通过 os.environ 设置对应变量,例如 os.environ['LOG_DIR'] = '/var/log/python_app'。
  3. 旧日志清理:即使已经配置了日志轮转,历史日志文件仍可能不断累积。可以借助 cron 定时清理,例如每天凌晨删除 7 天前的日志:0 0 * * * find /var/log/python_app -name "*.log" -mtime +7 -delete。

以上内容基本覆盖了 Ubuntu 下 Python 日志配置的常见使用场景。简单项目适合直接使用代码配置,复杂项目更适合通过配置文件统一管理,而需要更高效率和更多高级功能时,也可以选择 loguru 进行快速配置。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›