2016-07-25 61 views
1

我使用Zend记录器,带有在module_config.php以下配置过滤器:ZF2 Zend的记录器 - 优先

'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'); 

应该把它再没有输出滤波的呢?

+0

我在的application.ini此设置,例如:resources.log.stdout.filterParams.priority = 1 –

回答

1

问:如何将日志编写器过滤到特定的错误级别?

filters键添加到特定作者的配置中。这里的直接实例,以消除任何配置特点:本机只输出“警告”和“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(如上面完成的,它转换为内置的日志级别);
  • a string(对应于实施\Zend\Log\Filter\FilterInterface的类名);
  • an 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 

问:如何更改所有航线使用-v?

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

更新所有的路线并不难。您可以定义保存值的变量,然后包括在配置上,像这样:

$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 
+0

是,像php script.php -vvvv – KiwiJuicer

+0

好的,AFAIK你需要一个自定义类,提供的例子。 – bishop

+0

感谢您的详细答案,我即将实现的详细程度,但不幸的是,我的控制台调用并不期望-vvv参数,并说:“失败的原因:无效的参数或提供的参数” – KiwiJuicer