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

Posted

技术标签:

【中文标题】如何更改 PHP 在错误日志文件中写入错误的方式?【英文标题】:How to change the way PHP writes errors in the error log file? 【发布时间】:2013-05-09 00:16:31 【问题描述】:

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

所以我想确定,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 通知: 未定义变量:/home/www/dir/index.php 第 14 行中不存在的变量

很好,错误已记录。

但现在我有一个问题:

    它们都在一行中,没有中断。让人难以阅读。如何在新行中获取每个错误?

    我看到有一个时间戳。惊人的!我怎样才能添加用户的 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');

?>

【问题讨论】:

这在这个线程***.com/questions/30630484/…也有讨论 【参考方案1】:

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

这个函数有一个回调,当 PHP 遇到错误时会调用它,你可以采取相应的行动。

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

【讨论】:

我可以获得一份标准/内置错误处理程序的代码副本,以便我可以从那里修改现有代码吗? 我怀疑它对你有什么用处。据我所知,内置的错误处理程序是用 C 实现的,因为它在 PHP 的内部。 感谢您的帮助!我在原始问题中添加了一些代码,以显示我最终做了什么。任何关于这可能会或可能不会奏效的cmets将不胜感激!

以上是关于如何更改 PHP 在错误日志文件中写入错误的方式?的主要内容,如果未能解决你的问题,请参考以下文章

PHP error_log 方法不会将错误写入我的错误日志文件

php在代码中开启或关闭错误提示并将错误写入日志

php添加系统日志

如何在java中将错误日志或异常写入文件

怎么让php打印错误日志?

php错误日志保存