Монолог реализации с общим классом - PullRequest
0 голосов
/ 08 июня 2018

Мне удалось реализовать регистратор Monolog для тестирования.И сейчас я пытаюсь использовать это в проекте.Этот проект не использует MVC-фреймворк.

Я пытаюсь написать файл общего класса, чтобы обернуть доступ к экземпляру Monolog.

Общий файл класса: Файл: app_log.php

require 'autoload.php';
use Monolog\Logger;
use Monolog\Handler\RotatingFileHandler;
use Monolog\Processor\UidProcessor;
use Monolog\Processor\WebProcessor;
use Monolog\Processor\MemoryUsageProcessor;
use Monolog\Processor\ProcessIdProcessor;
use Monolog\Formatter\LineFormatter;

class app_log {
  public function info(){
    $logger = new Logger('applog');
    $handler = new RotatingFileHandler('useractivity.log', 0, Logger::INFO);
    $handler->setFormatter(new LineFormatter("[%datetime%] %extra.process_id% %channel%.%level_name%: %message% %extra% %context% \n"));
    $logger->pushHandler($handler);
    $logger->pushProcessor(new WebProcessor);
  }  
}

Другой файл: users.php

include_once 'app_log.php';
class users extends dbconnector{
    function login(){
      // Some project code. 
      $logger = new app_log();
      $logger->info('User logged successfully');
    }
}

До этого работает хорошо, и я хочу включить имя файла, имя метода, параметры запроса.Но я получаю app_log.php имя файла вместо users.php и имя метода 'info' вместо 'login' в журналах.

Пример:

[2018-06-07 20:55:50] 4410 applog.INFO: User logged successfully {"file":"/var/www/portal/lib/app_log.php","line":59,"class":"app_log","function":"info"} []

Не могли бы вы, ребята, помочь в этой части?

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

WebProcessor не будет добавлять нужные данные, я имею в виду файл и строку.

IntrospectionProcessor делает то, что вам нужно, попробуйте

$logger->pushProcessor(new IntrospectionProcessor());
0 голосов
/ 11 июня 2018

Боюсь, что весь ваш дизайн просто неверен.

Вместо того, чтобы создавать новый Logger каждый раз, когда вам нужно войти, вы должны создать один $logger для использования в качестве службы вокругваше приложение.

Не зная больше о вашем приложении (и необходимость переписать ваше приложение сделает вопрос слишком широким в любом случае), трудно догадаться, как реализовать внедрение зависимостей здесь.

Но упрощенный и наивный подход будет следующим:

class users extends dbconnector {

    protected $logger;

    public function _construct(Logger $logger) {
       $this->logger = $logger;
    }

    function login() {
      $this->logger->info('User logged successfully');
    }
}

А затем:

$logger  = new Logger('applog');
$handler = new RotatingFileHandler('useractivity.log', 0, Logger::INFO);
$handler->setFormatter(new LineFormatter("[%datetime%] %extra.process_id% %channel%.%level_name%: %message% %extra% %context% \n"));
$logger->pushHandler($handler);
$logger->pushProcessor(new WebProcessor);
$logger->pushProcessor(new IntrospectionProcessor);

$users = new users($logger);

Если вы добавите этот экземпляр Logger вОбъекты, которые нуждаются в этом, вы можете использовать его напрямую, не создавая собственную «обертку» (которая в вашем примере была плохо спроектирована), и выходные данные в файлах журналов будут соответствовать вашим ожиданиям.

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

(И также обратите внимание, что простое добавление этого процессора в ваш код не решит вашу проблему, так как вызовLogger::info() всегда происходит в app_log::info()).

Помните, что вам нужно добавить соответствующий оператор use: use Monolog\Processor\IntrospectionProcessor;

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

Например:

function get_logger() {
   static $logger;

   if ($logger !== null) {
      return $logger;
   }

   $logger  = new Logger('applog');
   $handler = new RotatingFileHandler('useractivity.log', 0, Logger::INFO);
   $handler->setFormatter(new LineFormatter("[%datetime%] %extra.process_id% %channel%.%level_name%: %message% %extra% %context% \n"));
   $logger->pushHandler($handler);
   $logger->pushProcessor(new WebProcessor);
   $logger->pushProcessor(new IntrospectionProcessor);

   return $logger;
}

Вы можете поместить это в файл, который вы require_once, и в каждом из этих мест, где вам нужен доступ к регистратору, вы можете просто сделать:

 get_logger()->info('write to the log!');

Это нечто-то, что я бы одобрил , но это крутой обходной путь для вас, чтобы двигаться, пока вы не продвинетесь в понимании других тем ООП.Это не что иное, как человек бедного синглтон , которого чаще всего следует избегать;но это может помочь вам прямо сейчас ..

...