如何将错误和警告记录到文件中?
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.ini 或 ini_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)
【讨论】:
以上是关于如何将错误和警告记录到文件中?的主要内容,如果未能解决你的问题,请参考以下文章