ZF2 Zend Logger — Фильтры по приоритету

Я использую Zend Logger со следующей конфигурацией в module_config.php:

'log' => [
\Base\Log\ConsoleLoggerAwareInterface::class => [
'writers' => [
'standard-output' => [
'name' => 'stream',
'options' => [
'stream' => 'php://output',
],
],
],
],
]

Но я не могу влиять на журнал, чтобы фильтровать или подавлять сообщения.
Цель состоит в том, чтобы улучшить ведение журнала, чтобы быть умнее.

Я думаю, что мне нужно добавить фильтр для писателя, но я не могу найти пример, как это сделать в module_config.php.

Есть ли способ вызвать скрипт (например, из cron), используя уровень детализации?

Я надеюсь, ты знаешь, чего я пытаюсь достичь.

Редактировать:

У меня есть этот пример в моем коде:

$this->consoleLogger->emerg('EMERG');
$this->consoleLogger->alert('ALERT');
$this->consoleLogger->crit('CRIT');
$this->consoleLogger->err('ERR');
$this->consoleLogger->warn('WARN');
$this->consoleLogger->notice('NOTICE');
$this->consoleLogger->info('INFO');
$this->consoleLogger->debug('DEBUG');

Должен ли он затем не выводить отфильтрованные?

1

Решение

Q: Как отфильтровать Log Writer до определенного уровня ошибок?

Добавить filters ключ к конфигурации конкретного автора. Вот прямой пример удаления любых особенностей конфигурации: он выводит только сообщения «WARN» и «EMERG»:

$config = [
'writers' => [
'standard-output' => [
'name' => 'stream',
'options' => [
'stream' => 'php://output',
'filters' => \Zend\Log\Logger::WARN,
],
],
],
];

$logger = new \Zend\Log\Logger($config);
$logger->emerg('EMERG');
$logger->warn('WARN');
$logger->debug('DEBUG');

Добавление filters Конфигурация к вашему modules_config.php должен иметь аналогичный эффект. Если нет, проверьте версию Zend-Log (например, composer show) и советую.


Q: Как изменить фильтр уровня ошибок с параметром командной строки -v?

AFAIK, нет автоматического способа связать стандартный многословный флаг (-v) с определенным уровнем ведения журнала. Так что вам придется написать свой собственный фильтр. Важно знать, что filters Ключ можно взять:

  • int (как сделано выше, что переводится на уровень встроенного журнала);
  • string (соответствует реализации имени класса \Zend\Log\Filter\FilterInterface);
  • object (экземпляр \Zend\Log\Filter\FilterInterface);
  • или массив из них.

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

class CliLoggingFilter implements \Zend\Log\Filter\FilterInterface
{
public function __construct()
{
$this->level = \Zend\Log\Logger::EMERG;
if (array_key_exists('v', $args = getopt('v'))) {
$this->level += count($args['v']);
}
}

public function filter(array $event)
{
return ($event['priority'] <= $this->level);
}
}

Тогда у вас будет такая конфигурация: 'filters' => CliLoggingFilter::class,

$ php public/index.php
2016-07-25T10:57:28-04:00 EMERG (0): EMERG
$ php public/index.php -vvvv
2016-07-25T10:57:32-04:00 EMERG (0): EMERG
2016-07-25T10:57:32-04:00 WARN (4): WARN
$ php public/index.php -vvvvvvv
2016-07-25T10:57:34-04:00 EMERG (0): EMERG
2016-07-25T10:57:34-04:00 WARN (4): WARN
2016-07-25T10:57:34-04:00 DEBUG (7): DEBUG

Q: Как изменить все маршруты для использования -v?

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

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

$globalConsoleRouteParams = '[--verbose|-v]';
return [ 'console' => 'router' => 'routes' => [
'foo' => [ 'options' => [ 'route' => "foo $globalConsoleRouteParams ..." ] ],
'bar' => [ 'options' => [ 'route' => "bar $globalConsoleRouteParams ..." ] ],
// ...
]];

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

class CliLoggingFilter implements \Zend\Log\Filter\FilterInterface
{
public function __construct()
{
$this->level = \Zend\Log\Logger::EMERG;
if (false !== ($level = getenv('LOG_LEVEL'))) {
$this->level = $level;
}
}
// ...
}

Тогда это может быть вызвано как

$ LOG_LEVEL=7 php index.php foo
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]