详解Yii框架日志配置与性能调试指南

Elena
Elena
发布时间:2026-10-14| 5人浏览过
原创

本文深入解析 PHP Yii 框架的日志系统与性能调试功能。通过配置 CLogRouter 实现多样化的日志输出,利用 Yii::profile 分析代码执行效率,并开启 SQL Profiling 实时监控数据库查询耗时,帮助开发者高效排查问题。

Yii 日志系统基础配置

Yii 框架默认将应用日志输出到 protected/runtime/application.log 文件。若需修改日志路径、级别或增加其他输出方式(如邮件、浏览器显示、数据库存储),需在 config/main.php 的 components 配置项中进行详细设置。

第1步:启用日志路由组件

目的:确保日志系统在应用启动时预加载并生效。

  • 入口: config/main.php 配置数组。
  • 动作: 在 preload 数组中添加 'log',并在 components 中定义 'log' 组件。
'preload' => array('log'),
'components' => array( 
    'log' => array( 
      'class' => 'CLogRouter', 
      'routes' => array(
        // ... 后续具体路由配置
      ), 
    ), 
  ),

第2步:配置日志路由规则 (Routes)

目的:定义不同级别的日志以何种形式(文件、邮件、网页底部)输出。

Yii 支持多种日志路由类,常见的包括:

  • CFileLogRoute:将日志写入指定文件,适合生产环境持久化记录。
  • CWebLogRoute:在页面底部显示日志,适合开发阶段快速查看。
  • CEmailLogRoute:当达到特定级别(如 error)时发送邮件通知管理员。
  • CDbLogRoute:将日志存入数据库表,便于后台查询。

以下是一个综合配置示例,展示了如何将不同类型的日志分流:

'routes' => array(
    // 1. 将 'test.*' 分类的 trace/info/debug/warn/error/fatal/profile 级日志写入 test.log
    array(
      'class' => 'CFileLogRoute', 
      'levels' => 'trace, info, debug, warn, error, fatal, profile', 
      'categories' => 'test.*', 
      'maxFileSize' => 1048576, // 单文件最大 1GB
      'logFile' => 'test.log', 
    ), 
    // 2. 仅将 profile 级别的日志通过 FireBug 显示在浏览器(需安装 FirePHP)
    array(
      'class' => 'CWebLogRoute', 
      'categories' => 'test.*', 
      'levels' => CLogger::LEVEL_PROFILE, 
      'showInFireBug' => true, 
      'ignoreAjaxInFireBug' => true,
    ),
    // 3. 将 'test.*' 分类的所有日志直接渲染在 HTML 页面底部
    array(
      'class' => 'CWebLogRoute', 
      'categories' => 'test.*', 
    ),
    // 4. 将 error 和 warning 级别日志发送至管理员邮箱
    array(
      'class' => 'CEmailLogRoute', 
      'levels' => 'error, warning', 
      'emails' => 'admin@example.com', 
    ),
),

运行机制说明: 每次调用 Yii::log() 时,日志先存入内存中的 CLogger 对象,然后逐个匹配 routes 中的规则。只有同时满足 levels(日志级别)和 categories(分类)的路由才会执行。这意味着同一条日志可以被多个不同的路由处理。

日志函数:Yii::log() 与 Yii::trace()

在代码中记录日志主要使用这两个方法,它们的区别在于是否受调试模式限制。

第3步:正确使用日志记录函数

用途: 在业务代码关键位置记录信息或追踪流程。

  • Yii::log($message, $level, $category):
    可以指定日志级别(trace, info, warning, error)和分类(category)。无论是否在调试模式下,只要路由允许,都会记录。适用于需要长期保留的业务日志。
  • Yii::trace($message, $category):
    主要用于开发阶段的流程跟踪。它只在开启了调试模式(YII_DEBUG = true)时生效,且不强制区分级别。适用于临时性的代码流向检查。
// 示例:记录 info 级别,分类为 cool.collectpd
// 由于配置中可能只将 cool.* 显示在网页端,此日志会出现在页面底部而非文件中
Yii::log('My log message.', 'info', 'cool.collectpd');

// 示例:记录 trace 级别,分类为 cool.pd
// 仅在 YII_DEBUG=true 时生效
Yii::trace('My log message.', 'cool.pd');

性能调试:Code Block Profiling

为了评估某段代码的执行效率,Yii 提供了内置的性能概要(Profiling)功能。

第4步:使用 beginProfile/endProfile 监控代码块

入口: 待测试的代码块前后。

动作: 包裹 Yii::beginProfile() 和 Yii::endProfile(),并使用相同的标识符(ID)。

Yii::beginProfile('blockID');
// ... code block being profiled ...
// 例如:数据库查询、复杂计算等
$users = UserModel::model()->findAll();
Yii::endProfile('blockID');

完成状态: 配合上述配置的 CProfileLogRoute 或 CWebLogRoute(设为 PROFILE 级别),可以在浏览器底部看到该代码块执行的毫秒数及递归统计。

高级调试:SQL 执行耗时监控 (DB Profiling)

在生产环境中,糟糕的 SQL 查询是导致性能下降的主要原因。通过开启数据库 Profiling,可以精确捕捉每一条 SQL 语句的执行时间。

第5步:开启数据库 Profiling 开关

需要在两处启用配置,否则即使配置了路由也无法获取数据。

1. 入口配置文件 (index.php): 定义全局常量以开启调试和 Profiling 支持。

$yii = dirname(__FILE__).'/../yii/framework/yii.php';
$config = dirname(__FILE__).'/protected/config/main.php';

// 开启调试模式
defined('YII_DEBUG') or define('YII_DEBUG', true);
// 开启 Profiling 总开关
defined('YII_DEBUG_PROFILING') or define('YII_DEBUG_PROFILING', true);
// 开启 Trace 层级深度
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL', 3);

require_once($yii);
Yii::createWebApplication($config)->run();

2. 入口数据库组件配置 (config/main.php 中的 db component):

'components' => array(
    'db' => array(
        'enableProfiling' => true,     // 核心:开启 SQL 执行时间记录
        'enableParamLogging' => true,  // 可选:记录 SQL 参数详情(数据量大时慎用)
    ),
)

第6步:配置 SQL 日志路由并查看结果

目的: 专门捕获 system.db.* 分类的 Profile 日志。

在 log 的 routes 中添加以下配置。推荐使用 CWebLogRoute 结合 FireBug 或浏览器开发者工具查看,比文件更直观。

array(
    'class' => 'CProfileLogRoute', 
    'levels' => CLogger::LEVEL_PROFILE, 
    'categories' => 'system.db.*', // 过滤只针对 DB 操作
    'showInFireBug' => true,       // 若使用 FirePHP 插件
    'ignoreAjaxInFireBug' => true,
),

或者也可以将其输出到文件:

array(
  'class' => 'CFileLogRoute', 
  'levels' => CLogger::LEVEL_PROFILE, 
  'categories' => 'system.db.*', 
  'logFile' => 'db.log', 
),

验证效果:

当配置正确且开启调试后,访问包含数据库操作的页面,在 FireBug 或浏览器控制台的网络/Console 面板中,可以看到类似下图的记录。相同的 Query 会被归类统计,展示 Total(总耗时)、Average(平均耗时)和 Calls(调用次数),这对于发现慢查询至关重要。

通过以上步骤,可以灵活地构建 Yii 应用的日志体系,从普通的信息记录深入到核心的 SQL 性能剖析,为系统优化提供数据支撑。

以上就是 Yii 框架日志配置与 SQL 调试的详细内容,更多关于 Yii 性能优化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。