Zend 启用 SQL 查询日志记录

Posted

技术标签:

【中文标题】Zend 启用 SQL 查询日志记录【英文标题】:Zend Enable SQL Query logging 【发布时间】:2011-11-13 21:42:50 【问题描述】:

我正在使用它来检索数据库连接 atm。

    $db = Zend_Db_Table::getDefaultAdapter();

我确实在我的配置中这样设置:

resources.db.adapter = pdo_mysql
resources.db.isDefaultTableAdapter = true
resources.db.params.host = localhost
resources.db.params.username = root
resources.db.params.password = password
resources.db.params.dbname = db
resources.db.params.profiler.enabled = true
resources.db.params.profiler.class = Zend_Db_Profiler

例如,我想将所有内容输出到 sql.log。这可以应用于默认适配器吗?例如通过设置,所以我可以在生产环境中忽略它?

非常感谢。

我确实看过:How to enable SQL output to log file with Zend_Db?,但它似乎没有涵盖我的问题。

/马库斯

【问题讨论】:

【参考方案1】:

有一个扩展 Zend_Db_Profiler 的示例,因此您可以将查询写入 /logs/db-queries.log 文件。

所以你必须做到以下几点:

    在库文件夹中创建 My_Db_Profiler_Log 类 将以下行添加到 application.ini

resources.db.params.profiler.enabled = true

resources.db.params.profiler.class= My_Db_Profiler_Log

注意:请注意,日志文件很快就会变得非常大!因此,只记录您感兴趣的查询是一个好主意。这个例子应该被视为实施这种记录系统的起点。

这是自定义分析器类的代码:

<?php

class My_Db_Profiler_Log extends Zend_Db_Profiler 

/**
 * Zend_Log instance
 * @var Zend_Log
 */
protected $_log;

/**
 * counter of the total elapsed time
 * @var double 
 */
protected $_totalElapsedTime;


public function __construct($enabled = false) 
    parent::__construct($enabled);

    $this->_log = new Zend_Log();
    $writer = new Zend_Log_Writer_Stream(APPLICATION_PATH . '/logs/db-queries.log');
    $this->_log->addWriter($writer);


/**
 * Intercept the query end and log the profiling data.
 *
 * @param  integer $queryId
 * @throws Zend_Db_Profiler_Exception
 * @return void
 */
public function queryEnd($queryId) 
    $state = parent::queryEnd($queryId);

    if (!$this->getEnabled() || $state == self::IGNORED) 
        return;
    

    // get profile of the current query
    $profile = $this->getQueryProfile($queryId);



        // update totalElapsedTime counter
        $this->_totalElapsedTime += $profile->getElapsedSecs();

        // create the message to be logged
        $message = "\r\nElapsed Secs: " . round($profile->getElapsedSecs(), 5) . "\r\n";
        $message .= "Query: " . $profile->getQuery() . "\r\n";

        // log the message as INFO message
        $this->_log->info($message);





?>

【讨论】:

【参考方案2】:

扩展 Zend_Db_Profiler 以写入 SQL.log 并将分析器附加到您的数据库适配器

<?php

class File_Profiler extends Zend_Db_Profiler 
 /**
  * The filename to save the queries
  *
  * @var string
  */
 protected $_filename;

 /**
  * The file handle
  *
  * @var resource
  */
  protected $_handle = null;

 /**
  * Class constructor
  *
  * @param string $filename
  */
 public function __construct( $filename ) 
   $this->_filename = $filename;
 

 /**
  * Change the profiler status. If the profiler is not enabled no
  * query will be written to the destination file
  *
  * @param boolean $enabled
  */
 public function setEnabled( $enabled ) 
   parent::setEnabled($enabled);

   if( $this->getEnabled() ) 
     if( !$this->_handle ) 
       if( !($this->_handle = @fopen($this->_filename, "a")) ) 
         throw new Exception("Unable to open filename $this->_filename for query profiling");
       
     
   
   else 
     if( $this->_handle ) 
       @fclose($this->_handle);
     
   
 

 /**
  * Intercept parent::queryEnd to catch the query and write it to a file
  *
  * @param int $queryId
  */
 public function queryEnd($queryId) 
   $state = parent::queryEnd($queryId);

   if(!$this->getEnabled() || $state == self::IGNORED) 
     return;
   

   $profile = $this->getQueryProfile($queryId);

   @fwrite($this->_handle, round($profile->getElapsedSecs(),5) . " " . $profile->getQuery() . " " . ($params=$profile->getQueryParams())?$params:null);
 

尚未对其进行测试,但它应该可以解决问题。试试看,然后告诉我。

顺便说一句,你知道你也可以在 mysql 上记录所有查询吗?

【讨论】:

你能稍微探索一下吗?【参考方案3】:

这将让您看到对网页的 sql 查询,可能偏离主题但它很有帮助

我强烈推荐你使用 ZF 调试栏,它会给你非常方便的信息 我用它来查看我的学说查询,它也支持zend db

https://github.com/jokkedk/ZFDebug

【讨论】:

以上是关于Zend 启用 SQL 查询日志记录的主要内容,如果未能解决你的问题,请参考以下文章

设置启用mysql慢查询日志

如何配置 OpenJPA SQL 日志记录?

在控制台中禁用 Rails SQL 日志记录

使用 JDBC 时如何为 SQL 语句启用日志记录

如何为一张表启用 sequelize 日志记录

如何启用 MySQL 查询日志?