CakePHP 2:在error.log中获取完整的SQL错误日志

时间:2013-01-29 13:23:31

标签: sql cakephp logging logfile

我希望能够在发生SQL错误时在error.log中记录完整的SQL查询。我的调试在core.php中设置为2。

输出显示如下:

2013-01-29 19:53:21 Error: SQLSTATE[HY000]: General error: 1364 Field 'street' doesn't have a default value
#0 D:\xampp\htdocs\my_project\lib\Cake\Model\Datasource\DboSource.php(459): PDOStatement->execute(Array)
#1 D:\xampp\htdocs\my_project\lib\Cake\Model\Datasource\DboSource.php(425): DboSource->_execute('INSERT INTO `st...', Array)
#2 D:\xampp\htdocs\my_project\lib\Cake\Model\Datasource\DboSource.php(1007): DboSource->execute('INSERT INTO `st...')

正如您所看到的,SQL语句只是部分记录,其余部分被删除,省略了省略号。

我正在使用DebugKit,但即使这样也不会在DebugKit窗口中产生完整的SQL日志。

我在这里抛出异常并记录getTraceAsString()。

任何解决方案都将受到高度赞赏。

谢谢你,
米^ E

3 个答案:

答案 0 :(得分:0)

您可以尝试使用this question的答案。我知道这不是最佳答案,但在该特定问题中,您可以找到this plugin,它将输出日志文件的完整SQL。

答案 1 :(得分:0)

我做了以下(Cake 2.5.6)

  1. 中创建自定义错误处理程序
      

    /app/Lib/Error/ErrorHandlerWithSqlLog.php

    App::uses('ErrorHandler', 'Error');
    class ErrorHandlerWithSqlLog{
        public static function handleException(Exception $exception) {
            if ($exception instanceof PDOException && !empty($exception->queryString)) {            
                CakeLog::write(LOG_ERR, "SQL query: ".$exception->queryString);
            }        
            ErrorHandler::handleException($exception);      
        }
    }
    

    将其添加到您的引导程序中:

    require_once(APP . 'Lib' . DS . 'Error' . DS . 'ErrorHandlerWithSqlLog.php');
    

    并将core.php中的默认异常处理程序更改为自定义处理程序:

    Configure::write('Exception', array(
        //'handler' => 'ErrorHandler::handleException',
        'handler' => 'ErrorHandlerWithSqlLog::handleException',
        'renderer' => 'ExceptionRenderer',
        'log' => true
    ));
    

答案 2 :(得分:0)

更容易捕捉到,

PDOException有一个名为queryString的属性,带有当前查询

您可以在_execute方法

中的源文件DboSource.php中看到
try {
$this->MyModel->find(....)
}catch(Exception $_ex) {
var_dump($_ex)
}

我希望对你有所帮助