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


233

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

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

Answers:


358

使用以下代码:

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

然后观看文件:

tail -f /tmp/php-error.log

php.ini按照此博客条目(自2008年)中的描述进行更新。


41
ini_set仅在执行该代码时才起作用。对于具有解析错误的代码没有用,因为该错误将代码执行之前发生。而是将这些更改写入php.ini。
hakre 2013年

9
如果您不能编辑php.ini文件,你应该能够在.htaccess补充一点:php_flag log_errors on php_value error_log /home/path/public_html/domain/PHP_errors.log。见perishablepress.com/...
马修

1
我有一个问题,如何在我的htdocs文件夹中创建error.log文件?
汤米

我想您只是将文件夹从更改为所需的tmp/php-error.log位置?
路加福音

这使我的PHP在5.4.0中崩溃
Supuhstar 2014年


42

只需将这些代码放在您的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

4
仅当您希望记录希望所有错误都显示在输出和/或浏览器中时display_errors绝对不要在实时生产服务器上打开该指令-该指令专门用于输出给用户,并且对日志记录没有影响。php.net/manual/en/...
亚伦Wallentine

22

将此代码添加到.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或其他服务器。


7
但是,这与Apache的PHP模块非常相关。
SacredSkull

9

那是我的个人短处

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

6

看一下log_errorsphp.ini 中的配置选项。它似乎可以满足您的要求。我认为您也可以使用该error_log选项来设置自己的日志文件。

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

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


1
display_errors如果启用,为什么应该禁用它log_errors?我认为这没有道理。:)
Guido Hendriks

5
因为不需要在生产服务器上向公众输出错误的内容,尤其是当错误的文本被谨慎地记录到文件中时。
Shabbyrobe,2010年

3
显示错误应始终在生产服务器上禁用。如果错误日志记录配置为其他位置,则不会,但是始终如此。默认情况下,错误记录到apache错误日志中,这通常就足够了。
Pihhan 2013年

1
在生产中显示错误使PHP变得更加流行:)
PeterM '18

0

此外,您需要“ AllowOverride Options”指令才能使其正常工作。(Apache 2.2.15)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.