【问题标题】:ZF2 Zend Logger - Filters by priorityZF2 Zend Logger - 按优先级过滤
【发布时间】:2016-07-25 13:03:26
【问题描述】:

我正在使用 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');

难道不应该输出过滤后的吗?

【问题讨论】:

  • 我在application.ini中有这个设置,例如:resources.log.stdout.filterParams.priority = 1

标签: php logging zend-framework2 verbosity


【解决方案1】:

问:如何将 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)并提出建议。


问:如何使用 -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' =&gt; 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

问:如何将所有路由改为使用-v?

AFAIK,无法指定全局命令行参数。您需要 (a) 更新所有控制台路由以接受参数或 (b) 以不同的方式传递日志级别。

更新所有路线并不难。您可以定义一个保存该值的变量,然后将其包含在配置中,如下所示:

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

或者,您可以使用say 环境变量来传递您想要的日志级别,以及您可能想要的任何其他配置。修改我们之前的例子:

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

【讨论】:

  • 是的,比如 php script.php -vvvv
  • 好的,AFAIK 你需要一个自定义类,提供示例。
  • 感谢您的详细回答,我即将实现冗长,但不幸的是,我的控制台调用不期望 -vvv 参数并说:“失败原因:无效参数或未提供参数"
  • 如何在不改变单个控制台路由的情况下解决这个问题?
  • 更新了答案以包含一些全局解决此问题的方法。
猜你喜欢
  • 2019-04-15
  • 2011-09-29
  • 1970-01-01
  • 2017-07-27
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多