PHP 7+ Класс логирования Магические константы

Я просто написал небольшой класс "logging" и хочу задать вопрос об использовании этого класса, как я могу сделать его проще в использовании.

Например:

$log = new Log();
$log->Error("You have an error!", __FILE__, __CLASS__, __FUNCTION__, __LINE__);

Вот как я сейчас пишу ошибки в лог-файл, но это кажется сложным?! Есть ли способ получить "ВОЛШЕБНЫЕ КОНСТАНТЫ" внутри класса регистрации от "вызывающего" php?

Вот код класса (любые другие советы приветствуются):

    <?php
    class Log
    {   
        private $path;

        public function __construct()
        {
            $config = new Config();         // init. from autoloader
            $path = $config->app_log_dir;

            if (!is_dir($path) && !is_writable($path))
            {
                error_log('[ERROR] [Log::__Construct()] -> ' . $path . ' does not exist or is not writeable!',0);
                header("HTTP/1.0 500 Internal Server Error");
                exit();
            }

            $this->path = $path;
        }

        public function Error($message, $file, $class = '', $function = '', $line)
        {
            $array_data = array($message, $file, $class, $function, $line);
            $this->write('ERROR', $array_data);
        }

        public function TestError($message, $file = __FILE__, $class = __CLASS__, $function = __FUNCTION__, $line = __LINE__)
        {
            $array_data = array($message, $file, $class, $function, $line);
            $this->write('TESTERROR', $array_data);
        }

        private function write($error_type, $array_data)
        {
            $date = date("Y-m-d H:i:s");
            $dateFile = date("Y-m-d");      

            $message = "[{$date}] [{$error_type}] [{$array_data[1]}->{$array_data[2]}::{$array_data[3]}:{$array_data[4]}] $array_data[0]".PHP_EOL;

            try 
            {
                file_put_contents($this->path.'/'.$dateFile.'.log', $message, FILE_APPEND);
            }
            catch (Exception $e)
            {
                error_log('[ERROR] [Log::write()] -> ' . $e, 0);
                header("HTTP/1.0 500 Internal Server Error");
                exit();
            }
        }
    }  

2 ответа

Решение

Проверять, выписываться debug_backtrace(),

Так что вы можете сделать:

public function Error($message, $debug)
{
    $array_data = array($message, $debug);
    $this->write('ERROR', $array_data);
}

$log->Error("Oh noo!!", print_r(debug_backtrace(),true) );

Обратный след содержит потенциально огромный объем данных, поэтому я не буду приводить здесь полный пример, но он может содержать:

  • function; Текущее имя функции. Смотрите также __FUNCTION__.
  • line; Текущий номер строки. Смотрите также __LINE__.
  • file; Текущее имя файла. Смотрите также __FILE__.
  • class; Текущее имя класса. Смотрите также __CLASS__.
  • object; Текущий объект.
  • type; Текущий тип звонка. Если вызов метода " -> "возвращается. Если вызов статического метода" :: "возвращается. Если вызов функции, ничего не возвращается.
  • args; Если внутри функции, это перечисляет аргументы функции. Если внутри включенного файла, это перечисляет включенные имена файлов.

debug_backtrace() является золотой жилой информации для отладки PHP. Это охватывает все, что вы просите в своем вопросе.

Вместо этого передайте эти константы как параметры функции:

public function Error(
    $message,
    $file = __FILE__,
    $class = __CLASS__,
    $function = __FUNCTION__,
    $line = __LINE__,
) {
    // ...
}

и звоните как всегда

$log->Error('xxx');

Если позволите, ваш код пахнет, почему бы не использовать PSR-3-совместимый регистратор, такой как Monolog? Или даже обрабатывать ошибки, как профессионал с Whoops.

Другие вопросы по тегам