如何将错误和警告记录到文件中?

Posted

技术标签:

【中文标题】如何将错误和警告记录到文件中?【英文标题】:How do I log errors and warnings into a file? 【发布时间】:2011-04-01 16:41:33 【问题描述】:

如何打开所有错误和警告并将它们记录到文件中,但要在脚本中设置所有这些(不更改 php.ini 中的任何内容)?

我想定义一个文件名,以便将所有错误和警告都记录到其中。

【问题讨论】:

【参考方案1】:

使用以下代码:

ini_set("log_errors", 1);
ini_set("error_log", "/tmp/php-error.log");
error_log( "Hello, errors!" );

然后看文件:

tail -f /tmp/php-error.log

或者从 2008 年开始更新 php.ini,如 this blog entry 中所述。

【讨论】:

ini_set 仅在执行该代码时才有效。对于具有解析错误的代码没有用处,因为错误将在代码执行之前出现。而是将这些更改写入 php.ini。 如果您无法编辑 php.ini,您应该可以将其添加到 .htaccess 中:php_flag log_errors on php_value error_log /home/path/public_html/domain/PHP_errors.log。见perishablepress.com/… 我有一个问题,如何在我的 htdocs 文件夹中创建 error.log 文件? 我猜您只是将文件夹从 tmp/php-error.log 更改为您想要的任何位置? 这会使我的 PHP 在 5.4.0 中崩溃【参考方案2】:

error_log — 在某处发送错误消息

例子

error_log("You messed up!", 3, "/var/tmp/my-errors.log");

您可以customize error handling with your own error handlers 在发生错误或警告或您需要记录的任何内容时为您调用此函数。 更多信息请参考Chapter Error Handling in the PHP Manual

【讨论】:

如果出现致命错误,PHP 将无法记录任何内容。【参考方案3】:

只需将这些代码放在 PHP/index 文件的顶部即可:

error_reporting(E_ALL); // Error/Exception engine, always use E_ALL

ini_set('ignore_repeated_errors', TRUE); // always use TRUE

ini_set('display_errors', FALSE); // Error/Exception display, use FALSE only in production environment or real server. Use TRUE in development environment

ini_set('log_errors', TRUE); // Error/Exception file logging engine.
ini_set('error_log', 'your/path/to/errors.log'); // Logging file path

【讨论】:

只有在您希望所有错误都显示在输出和/或浏览器中时,除了日志记录。 display_errors 永远不应该在实时生产服务器上打开——该指令专门用于向用户输出,并且对日志记录没有影响。 php.net/manual/en/…【参考方案4】:

将此代码添加到文件 .htaccess 中(作为文件 php.iniini_set 函数的替代方法):

<IfModule mod_php5.c>
php_flag log_errors on 
php_value error_log ./path_to_MY_PHP_ERRORS.log
# php_flag display_errors on 
</IfModule>
如评论:这是针对 Apache 类型的服务器,而不是针对 Nginx 或其他服务器。

【讨论】:

然而,这与 Apache 的 PHP 模块非常相关。【参考方案5】:

这是我个人的简短功能

# logging
/*
[2017-03-20 3:35:43] [INFO] [file.php] Here we are
[2017-03-20 3:35:43] [ERROR] [file.php] Not good
[2017-03-20 3:35:43] [DEBUG] [file.php] Regex empty

mylog ('hallo') -> INFO
mylog ('fail', 'e') -> ERROR
mylog ('next', 'd') -> DEBUG
mylog ('next', 'd', 'debug.log') -> DEBUG file debug.log
*/
function mylog($text, $level='i', $file='logs') 
    switch (strtolower($level)) 
        case 'e':
        case 'error':
            $level='ERROR';
            break;
        case 'i':
        case 'info':
            $level='INFO';
            break;
        case 'd':
        case 'debug':
            $level='DEBUG';
            break;
        default:
            $level='INFO';
    
    error_log(date("[Y-m-d H:i:s]")."\t[".$level."]\t[".basename(__FILE__)."]\t".$text."\n", 3, $file);

【讨论】:

解释一下。例如,想法/要点是什么?请通过editing (changing) your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。【参考方案6】:

看看 php.ini 中的log_errors 配置选项。它似乎只是做你想做的事。我想你也可以使用error_log 选项来设置你自己的日志文件。

log_errors 指令设置为On 时,PHP 报告的任何错误都将记录到服务器日志或error_log 指定的文件中。如果需要,您也可以使用 ini_set 设置这些选项。

(请注意display_errors如果启用此选项,应在php.ini中禁用)

【讨论】:

如果启用log_errors,为什么要禁用display_errors?在我看来没有意义。 :) 因为不需要在生产服务器上向公众输出错误的内容,尤其是当错误的文本被谨慎地记录到文件中时。 显示错误应始终在生产服务器上禁用。如果错误日志被配置到其他地方,则不会,但总是如此。默认情况下,错误会记录到 apache 错误日志中,这通常就足够了。 在生产环境中显示错误让 PHP 更受欢迎 :)【参考方案7】:

此外,您需要“AllowOverride Options”指令才能使其工作。 (阿帕奇 2.2.15)

【讨论】:

以上是关于如何将错误和警告记录到文件中?的主要内容,如果未能解决你的问题,请参考以下文章

Make - 特定文件的“将警告视为错误”

将每个进程记录到不同的日志文件

Serilog - 多个日志文件

PHP 将PHP错误,通知,警告,异常和调试记录到Firebug控制台

MySQL物理文件组成

您将如何手动触发将错误从节点快递记录到哨兵?