4

我已经在我的网站上工作了一年多,我非常渴望最终把它放在那里供人们使用。然而它已经变得相当大了——我几乎想说我无法控制——最重要的是,我真的只是一个自学成才的业余程序员。

所以我想确定,php 产生的任何错误都记录在一个文件中,这样我就可以访问这个文件并跟踪错误。

目前我的设置如下:

<?php
error_reporting(E_ALL);
ini_set('display_errors', '0');
ini_set('log_errors', 1);
ini_set('error_log', 'errors.log');
?>

到目前为止工作得很好,我的 error.log 文件将包含如下内容:

[2013 年 5 月 14 日 00:16:26] PHP 通知:未定义变量:第 14 行 /home/www/dir/index.php 中不存在变量 [2013 年 5 月 14 日 00:16:28] PHP 通知:未定义变量:第 14 行的 /home/www/dir/index.php 中不存在变量

太好了,错误已记录。

但是现在我有一个问题:

  1. 他们都在一条线上,没有休息。让人难以阅读。如何在新行中获取每个错误?

  2. 我看到有一个时间戳。惊人的!我怎样才能添加用户的 IP 地址或任何其他自定义内容?

再次,我的问题:

如何更改 PHP 在错误日志文件中写入错误的方式? 特别是,如何在记录的每个错误之后创建一个新行,以便 error.log 文件更易于阅读。以及如何添加自定义数据和值,例如 IP 地址?

答案: 我最终做了以下事情——这似乎在某种程度上重现了 php 的标准做法,并且可以从那里进行修改。

<?php
function my_error_handler($type, $message, $file, $line, $vars)
{
    switch($type) 
    { 
        case 1: // 1 // 
            $type_str = 'ERROR'; 
            break;
        case 2: // 2 // 
            $type_str = 'WARNING';
            break;
        case 4: // 4 // 
            $type_str = 'PARSE';
            break;
        case 8: // 8 // 
            $type_str = 'NOTICE'; 
            break;
        case 16: // 16 // 
            $type_str = 'CORE_ERROR'; 
            break;
        case 32: // 32 // 
            $type_str = 'CORE_WARNING'; 
            break;
        case 64: // 64 // 
            $type_str = 'COMPILE_ERROR'; 
            break;
        case 128: // 128 // 
            $type_str = 'COMPILE_WARNING'; 
            break;
        case 256: // 256 // 
            $type_str = 'USER_ERROR'; 
            break;
        case 512: // 512 // 
            $type_str = 'USER_WARNING'; 
            break;
        case 1024: // 1024 // 
            $type_str = 'USER_NOTICE'; 
            break;
        case 2048: // 2048 // 
            $type_str = 'STRICT'; 
            break;
        case 4096: // 4096 // 
            $type_str = 'RECOVERABLE_ERROR'; 
            break;
        case 8192: // 8192 // 
            $type_str = 'DEPRECATED'; 
            break;
        case 16384: // 16384 // 
            $type_str = 'USER_DEPRECATED'; 
            break;
    }


    $errormessage =  '[ '.date(r).' ] '.$type_str.': '.$message.' in '.$file.' on line '.$line."\n";
   // for development simply ECHO $errormessage;

        $file = 'my_errors.log';
        file_put_contents($file, $errormessage, FILE_APPEND);
}

error_reporting(E_ALL);
ini_set('display_errors', '0');
set_error_handler('my_error_handler');

?>
4

1 回答 1

3

您无法使用内置错误处理程序进行任何额外的自定义或实现任何逻辑,您需要使用set_error_handler().

此函数接受一个回调,当 PHP 遇到错误时将调用该回调,您可以采取相应的行动。

请参阅文档上的示例,了解如何使用此函数以及如何实现正确的回调。

于 2013-05-14T16:09:40.223 回答