ZF2 Zend Logger - 按优先级过滤
ZF2 Zend Logger - Filters by priority
我在 module_config.php 中使用具有以下配置的 Zend Logger:
'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');
是不是过滤后的就不要输出了?
问:如何将 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
键可以采用:
- an
int
(如上所述,转换为内置日志级别);
- a
string
(对应于实现\Zend\Log\Filter\FilterInterface
的class名称);
- 一个
object
(\Zend\Log\Filter\FilterInterface
的实例);
- 或这些数组。
您可以利用这种灵活性来解决将命令行参数绑定到日志值的需要。这是默认情况下显示紧急事件的自定义 class,但对于命令行上的每个 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
我在 module_config.php 中使用具有以下配置的 Zend Logger:
'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');
是不是过滤后的就不要输出了?
问:如何将 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
键可以采用:
- an
int
(如上所述,转换为内置日志级别); - a
string
(对应于实现\Zend\Log\Filter\FilterInterface
的class名称); - 一个
object
(\Zend\Log\Filter\FilterInterface
的实例); - 或这些数组。
您可以利用这种灵活性来解决将命令行参数绑定到日志值的需要。这是默认情况下显示紧急事件的自定义 class,但对于命令行上的每个 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