Как записать ошибки и предупреждения в файл?

Как включить все ошибки и предупреждения и записать их в файл, но настроить все это внутри скрипта (ничего не меняя в php.ini). Я хочу определить имя файла и сделать так, чтобы в него входили все ошибки и предупреждения.

9 ответов

Используйте следующий код:

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 года.

Увидеть

  • error_log - отправить сообщение об ошибке куда-нибудь

пример

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

Вы можете настроить обработку ошибок с помощью своих собственных обработчиков ошибок, чтобы вызывать эту функцию для вас всякий раз, когда возникает ошибка или предупреждение, или что вам нужно для регистрации. За дополнительной информацией обращайтесь к главе "Обработка ошибок" в руководстве по PHP.

Просто поместите эти коды в начало вашего файла PHP/index:

error_reporting(E_ALL); // Error engine - always ON!

ini_set('display_errors', TRUE); // Error display - OFF in production env or real server

ini_set('log_errors', TRUE); // Error logging

ini_set('error_log', 'your/path/to/errors.log'); // Logging file

ini_set('log_errors_max_len', 1024); // Logging file size

Добавьте этот код в .htaccess (в качестве альтернативы функции php.ini / ini_set):

<IfModule mod_php5.c>
php_flag log_errors on 
php_value error_log ./path_to_MY_PHP_ERRORS.log
</IfModule>

ps это для серверов типа Apache.

Это моя личная короткая функция

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

Посмотрите на log_errors опция конфигурации в php.ini. Кажется, делать то, что вы хотите. Я думаю, что вы можете использовать error_log возможность установить свой собственный файл журнала тоже.

Когда log_errors директива установлена On любые ошибки, о которых сообщает PHP, будут записываться в журнал сервера или в файл, указанный с помощью error_log, Вы можете установить эти параметры с ini_set тоже, если нужно.

(Обратите внимание, что display_errors должен быть отключен в php.ini, если эта опция включена)

Ни в одном из этих ответов не упоминается важность или актуальность для Agile-команд; Работа по развитию профессионального уровня чаще всего выполняется в контексте команды.

Имея в виду, что многие команды разработчиков используют инструмент отслеживания задач, такой как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.

Кроме того, вам нужна директива "AllowOverride Options", чтобы это работало. (Apache 2.2.15)

вот моя функция журнала:

Вы можете редактировать строки журнала, редактируя$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"
    }
]
Другие вопросы по тегам