Cakephp 3-如何在单独的文件中记录所有404错误

时间:2018-11-29 10:50:26

标签: cakephp-3.0

机器人或黑客用对/phpmyadmin/等不存在的URL的请求轰炸我们的网站,这使我的错误日志变得毫无用处,因为我需要查看的错误很少而且相差甚远。我不想跳过使用skiplog选项记录它们的情况,因为在某个时候我仍然需要查看所有那些NotFoundException和MissingControllerExceptions。

1 个答案:

答案 0 :(得分:0)

在app.php文件中配置新的Log选项:

'Log' => [
    '404' => [
        'className' => 'Cake\Log\Engine\FileLog',
        'path' => LOGS,
        'file' => '404',
        'url' => env('LOG_ERROR_URL', null),
        'scopes' => ['404'],
    ],
    ...

在此处创建一个新文件:src/Error/AppErrorHandler.php,其中包含此内容

namespace App\Error;

use Cake\Error\ErrorHandler;
use Cake\Log\Log;
use Exception;
class AppErrorHandler extends ErrorHandler
{
    /**
     * Handles exception logging
     *
     * @param \Exception $exception Exception instance.
     * @return bool
     */
    protected function _logException(Exception $exception)
    {
        $notFoundExceptions = [
            'Cake\Routing\Exception\MissingControllerException',
            'Cake\Http\Exception\NotFoundException',
            'Cake\Http\Exception\UnauthorizedException',
        ];
        if (in_array(get_class($exception), $notFoundExceptions)) {
            return Log::error($this->_getMessage($exception), '404');
        } else {
            return parent::_logException();
        }
    }
}

在您应用的bootstrap.php文件中注册此AppErrorHandler。对我来说,这意味着替换第109行中默认ErrorHandler (new ErrorHandler(Configure::read('Error')))->register();的注册,如下所示:

(new \App\Error\AppErrorHandler(Configure::read('Error')))->register();