【发布时间】: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');
?>
【问题讨论】:
-
这在这个线程stackoverflow.com/questions/30630484/…也有讨论
标签: php error-logging error-reporting error-log ini-set