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

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


See

error_log -在某处发送错误消息

例子

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

您可以使用自己的错误处理程序定制错误处理,以便在发生错误或警告或需要记录的任何事情时为您调用此函数。 有关更多信息,请参阅PHP手册中的章节错误处理


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

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

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


使用以下代码:

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。


在.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或其他服务器。


此外,你需要“AllowOverride Options”指令来实现这个功能。(Apache 2.2.15)


这是我个人的简短函数

# 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);
}

简单地把这些代码放在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

这是我的log函数:

您可以通过编辑$maxLogs=5编辑日志行, $logOrder='top'

<?php
lg('script start','start');

#Code......
lg('script end','End of code');

function lg($str,$mod='Your Log Category'){
    $ts = microtime(true);
    if(!defined('logTimer')){
        define('logTimer',microtime(true));
    }
    $diff=abs(round(($ts-logTimer)*1000,2));
    $maxLogs=5;
    $logOrder='top';#new Logs at top
    
    
    $filename = './log.txt';
    $log=[];
    if(!file_exists($filename)){
        if(!file_put_contents($filename,json_encode($log,128))){
            echo "Can’t open to write '$filename' Check Permissions";
            return;
        }
    }else{
        $c=file_get_contents($filename);
        if(trim($c)==''){$c='[]';}
        
        $log =@json_decode($c,true);
        if(!is_Array($log)){$log=[];}
    }
    $new=['mod'=>$mod,'date'=> date('Y-m-d H:i:s')." Scripttime: ".$diff."ms",'log'=>$str];
    if($logOrder=='top'){
        array_unshift($log , $new);
        $log=array_slice($log,0,$maxLogs);
        }else{
        $log[]=$new;
        $log=array_slice($log,0-$maxLogs,$maxLogs);
    }
    
    
    $logs=json_encode($log,128);
    if(!file_put_contents($filename,$logs) ){echo ("Can’t open to write '$filename' Check Permissions") ;return;}
    return $str;
}
?>

输出如下所示:

[
    {
        "mod": "delete",
        "date": "2022-08-04 13:48:02 0.33ms",
        "log": "test 2"
    },
    {
        "mod": "start",
        "date": "2022-08-04 13:48:29 0ms",
        "log": "test"
    },
    {
        "mod": "delete",
        "date": "2022-08-04 13:48:29 0.27ms",
        "log": "test 2"
    },
    {
        "mod": "start",
        "date": "2022-08-04 13:48:34 0ms",
        "log": "test"
    },
    {
        "mod": "delete",
        "date": "2022-08-04 13:48:34 0.92ms",
        "log": "test 2"
    }
]

这些答案中没有一个提到敏捷团队的重要性或相关性;专业级别的开发工作通常不是在一个团队的范围内完成的。

请记住,许多开发团队使用任务跟踪工具,如JIRA,我更喜欢使用时间戳将每个错误记录为一个单独的文件:

error_reporting(E_ALL);
ini_set('log_errors', 1);
ini_set('error_log', $_SERVER['DOCUMENT_ROOT'] . '/logs/php/php-errors-' . time() . '.txt');

使用这种方法,项目经理或团队负责人可以很容易地将每个错误隔离为一个特定的文件,然后将该文件附加到一个唯一的JIRA缺陷,分配给开发人员,并跟踪(时间戳可以链接到缺陷内部,以便在缺陷修复正在进行时轻松跟踪)。当问题解决后,可以从日志目录中删除该文件,而在JIRA中可以访问该文件的副本(如果将来需要的话)。