ZF2 Zend的记录器 - 优先
我使用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');
应该把它再没有输出滤波的呢?
问:如何将日志编写器过滤到特定的错误级别?
将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
是,像php script.php -vvvv – KiwiJuicer
好的,AFAIK你需要一个自定义类,提供的例子。 – bishop
感谢您的详细答案,我即将实现的详细程度,但不幸的是,我的控制台调用并不期望-vvv参数,并说:“失败的原因:无效的参数或提供的参数” – KiwiJuicer
我在的application.ini此设置,例如:resources.log.stdout.filterParams.priority = 1 –