2016-07-25 77 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