問:如何將日誌編寫器過濾到特定的錯誤級別?
將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
我在的application.ini此設置,例如:resources.log.stdout.filterParams.priority = 1 –