ubuntu

Ubuntu下Python日志配置怎么设置

小樊
42
2025-10-01 18:27:46
栏目: 编程语言

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配置文件为例:

1. 创建配置文件(如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  # 时间格式

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信息:会输出到控制台和文件')

效果

三、第三方库简化配置(推荐进阶)

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

效果

2. 异常捕获示例

from loguru import logger

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

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

效果
app.log中会记录完整的异常信息,包括错误类型、堆栈跟踪和触发位置。

四、日志轮转管理(避免文件过大)

日志文件长期运行会占用大量磁盘空间,需通过轮转(按大小/时间分割)解决。以下是两种常用方式:

1. 代码配置(TimedRotatingFileHandler)

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

2. 配置文件配置(RotatingFileHandler)

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个备份。

五、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天前的日志):
    # 编辑cron任务(crontab -e)
    0 0 * * * find /var/log/python_app -name "*.log" -mtime +7 -delete
    

以上方法覆盖了Ubuntu下Python日志配置的常见场景,可根据项目需求选择合适的方式(简单项目用代码配置,复杂项目用配置文件,进阶项目用loguru)。

0
看了该问题的人还看了