Хобрук: Ваш путь к мастерству в программировании

Как отключить журналы отладки с помощью Monolog

Я использую Monolog в проекте, это не Symfony, а просто мое собственное приложение, использующее автономный пакет композитора Monolog.

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

Мне казалось, что самый простой способ сделать это - расширить StreamHandler и переопределить метод записи StreamHandler, подобный этому.

class DurpLogger extends StreamHandler {
    protected function write(array $record) {
        if ($this->getLevel() == Durp::Debug && !Configuration::debug()) {
            return;
        }
        parent::write($record);
    }
}

Поэтому, если поступает запрос журнала и уровень журнала для обработчика установлен на DEBUG, а Configuration :: debug () приложения имеет значение FALSE, тогда просто вернитесь, не записывая сообщение журнала. В противном случае StreamHandler сделает свое дело.

Мне интересно, лучший ли это способ использовать Monolog или, возможно, есть более чистый способ сделать это.

Я предполагаю, что в моем приложении будет обработчик для DEBUG, INFO, ERROR и любых уровней, которые могут мне понадобиться для моего приложения. Возможно, имеет смысл полагаться не на Configuration :: debug (), который может иметь только значение TRUE или FALSE, а на Configuration :: logLevel (), который позволит мне более детально контролировать вывод журнала.

Но, тем не менее, имеет ли смысл расширение StreamHandler при управлении Monolog на уровне приложения?

ОБНОВЛЕНИЕ

Теперь я думаю о чем-то вроде этого, в котором используется уровень, а не просто логическая отладка.

class DurpLogger extends StreamHandler {
    public function __construct() {
        parent::__construct(Configuration::logFile(), Configuration::logLevel());
    }

    protected function write(array $record) {
        if (!($this->getLevel() >= Configuration::logLevel())) {
            return;
        }
        parent::write($record);
    }
}

Тогда я бы использовал это в приложении вот так.

class Durp {
  private $logger;
  public function __construct() {
        $this->logger = new Logger('durp-service');
        $this->logger->pushHandler(new DurpLogger());
        $this->logger->addDebug('Debugging enabled');
        $this->logger->addInfo('Starting Durp');
    }
}

Я подумал, что StreamHandler обрабатывает записи файлов, поэтому я расширяю его. И если я увеличиваю уровень журнала в Configuration до Logger :: INFO, сообщение «Отладка включена» не регистрируется.

Открыт для предложений, чтобы сделать это лучше.


Ответы:


1

Распространенной альтернативой было бы использование NullHandler. вместо StreamHandler.

Возможно, переключаться между ними в зависимости от вашего состояния, например:

if (!Configuration::debug()) {
    $logger->pushHandler(new \Monolog\Handler\NullHandler());
}

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

Обновить

Что касается вопроса о формате по умолчанию, пустой [] в конце представляет дополнительные данные, которые могут быть добавлены с записями журнала.

От @Seldaek (владелец Monolog):

Формат по умолчанию LineFormatter: «[% datetime%]% channel%.% Level_name%:% message% context%% extra% \ n». имя пользователя / возраст - это контекст, а дополнительные, обычно пустые, приводят к этому пустому массиву [].

Если вы используете процессоры для присоединения данных к записям журнала, они обычно записывают их в дополнительный ключ, чтобы избежать конфликтов с контекстной информацией. Если это действительно проблема для вас, вы можете изменить формат по умолчанию и опустить% extra%.

Изменить: Начиная с Monolog 1.11 LineFormatter имеет параметр $ ignoreEmptyContextAndExtra в конструкторе, который позволяет вам удалить их, поэтому вы можете использовать это:

// the last "true" here tells it to remove empty []'s

$formatter = new LineFormatter(null, null, false, true);
$handler->setFormatter($formatter);

См. Как не показывать последнюю скобку в монологе строка журнала? и Symfony2: используйте процессоры при входе в разные файлы о процессорах, о которых говорит @Seldaek.

24.02.2016
  • Я обновил вопрос, чтобы включить дальнейшие мысли по этому вопросу. 24.02.2016
  • Я думаю, что читаю слишком быстро. Вы вообще не хотите отключать отладку, просто измените уровень отладки? 24.02.2016
  • Верно, вот что я понял. Иногда Stack Overflow служит отличной резиновой уточкой для разговора. И, надеюсь, это поможет кому-то выполнить эту очень распространенную задачу. 24.02.2016
  • То, как вы используете, чистое, также, если оно соответствует вашим потребностям, почему бы и нет. 24.02.2016
  • Я думаю, что это выглядит хорошо, но, к сожалению, или, к счастью, в зависимости от ваших предпочтений, я не работаю ни с кем, кто думает о PHP на этом уровне. Поэтому я не всегда знаю, упускаю ли я что-то или делаю что-то не лучшим образом. 24.02.2016
  • Что ж, я не вижу никакого способа оптимизировать вашу логику на данный момент, возможно, кто-то еще даст вам больше информации 24.02.2016
  • Мне интересно узнать о формате по умолчанию для монолога. [2016-02-24 14:35:59] durp-service.DEBUG: Включена отладка [] [] Для чего нужны слоты в скобках и как вы помещаете туда данные или избавляетесь от них? 24.02.2016
  • Я обновил свой ответ, чтобы подробнее рассказать об этих скобках. 24.02.2016
  • Новые материалы

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

    React Hooks: основы деструктуризации массива
    Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

    Пакеты R, используемые в Tesla
    Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

    Сокращение и слияние токенов для эффективных моделей VL: обзор
    Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..