如何更改PHP在错误日志文件中写入错误的方式?

How to change the way PHP writes errors in the error log file?

提问人:oliver_siegel 提问时间:5/15/2013 最后编辑:oliver_siegel 更新时间:5/15/2013 访问量:2065

问:

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

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

目前我的设置如下:

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

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

[14-五月-2013 00:16:26]PHP 注意:未定义的变量:第 14 行 /home/www/dir/index.php 中的 nonexistent变量[2013 年 5 月 14 日 00:16:28] PHP 注意:未定义的变量:第 14 行 /home/www/dir/index.php 中的 nonexistentvariable

太好了,错误被记录下来。

但是现在我有一个问题:

  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');

?>
php 报告 错误日志 ini-set

评论

0赞 Salagir 2/22/2017
此线程中也对此进行了讨论 stackoverflow.com/questions/30630484/...
0赞 jpgerb 2/16/2023
此外,您应该从处理程序中删除变量,它只接受前 4 个变量,并且您无论如何都不会使用它。我敢肯定这是某个地方的更新,但对于 5 年后正在寻找的人来说,注意它可能会有所帮助。$vars

答:

3赞 nickb 5/15/2013 #1

你不能使用内置的错误处理程序进行任何额外的自定义或实现任何逻辑,你需要用 set_error_handler() 设置你自己的错误处理程序。

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

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

评论

0赞 oliver_siegel 5/15/2013
我可以获取标准/内置错误处理程序的代码副本,以便我可以从那里修改现有代码吗?
1赞 nickb 5/15/2013
我怀疑这对你有什么用。据我所知,内置的错误处理程序是用 C 语言实现的,因为它在 PHP 的内部。
1赞 oliver_siegel 5/15/2013
感谢您的帮助!我在原来的问题中添加了一些代码,以显示我最终做了什么。任何关于这可能或可能不起作用的评论将不胜感激!