2017-03-08 26 views
0

私はZF 3アプリケーションを持っています。明示的にログするメッセージ(例:$log->debug())例外はありません。エラーが表示されるように見えるのは、これがデフォルトのPHP設定でstderrに行くからです。Zend-Logのエラーハンドラと例外マネージャを正しく設定していますか?

'service_manager' => [ 
    'factories' => [ 
     . . . . 
     'log' => \Zend\Log\LoggerServiceFactory::class, 

    ], 
], 
'log' => [ 
    'writers' => [ 
     [ 
      'name' => 'stream', 
      'options' => [ 'stream' => 'php://stderr' ] 
     ], 
    ], 
    'errorHandler' => true, 
    'exceptionhandler' => true, 
], 

The lines in the source that lead me to believe this is the correct config:ここmodules.config.phpから関連する行です。すべて(

public function errorAction() 
{ 
    $msg = $this->params()->fromQuery('msg', 'Default Error message'); 
    trigger_error('Index Error Action' . $msg, E_USER_ERROR); 
    $model = new JsonErrorModel(['msg' => $msg]); 
    return $model; 
} 

public function exceptionAction() 
{ 
    $msg = $this->params()->fromQuery('msg', 'Default Error message'); 
    throw new \RuntimeException('Index Exception Action' . $msg); 
    $model = new JsonErrorModel(['msg' => $msg]); 
    return $model; 
} 

答えて

1

あなたの設定配列にタイプミスがあり

'log' => [ 
    .... 
    'errorHandler' => true, 
    .... 
], 
このインデックスはキャメルケースすべきではない

それはerrorhandlerする必要があります:

if (isset($options['exceptionhandler']) && $options['exceptionhandler'] === true) { 
     static::registerExceptionHandler($this); 
    } 

    if (isset($options['errorhandler']) && $options['errorhandler'] === true) { 
     static::registerErrorHandler($this); 
    } 

それをテストするために、私は次のようendpouintsを作りました文字は小文字です)。また、致命的なエラーを記録するように、構成にfatal_error_shutdownfunction => trueを追加します。

Zendは例外処理にset_exception_handlerを使用します。したがって、例外のロギングはtry/catchブロックにない場合にのみ機能することに注意してください。 http://php.net/manual/en/function.set-exception-handler.php

これらのすべての機能を手動で設定することができる:

\Zend\Log\Logger::registerErrorHandler($logger); 
\Zend\Log\Logger::registerFatalErrorShutdownFunction($logger); 
\Zend\Log\Logger::registerExceptionHandler($logger); 

もし

は、例外がtry/catchブロック内
ソースをキャッチされていない場合、デフォルトの例外ハンドラを設定します。テストしたい場合、次のことを実行できます:

エラーがログに書くべき

public function errorAction() 
{ 
    $log = $this->getServiceLocator()->get('log'); // init logger. You shouldn't use getServiceLocator() in controller. Recommended way is injecting through factory 
    array_merge([], 111); 
} 

2017-03-09T15:33:47+01:00 WARN (4): array_merge(): Argument #2 is not an array {"errno":2,"file":"[...]\\module\\Application\\src\\Application\\Controller\\IndexController.php","line":80} 

致命的なエラーが発生しまし

public function fatalErrorAction() 
{ 
    $log = $this->getServiceLocator()->get('log'); // init logger. You shouldn't use getServiceLocator() in controller. Recommended way is injecting through factory 
    $class = new ClassWhichDoesNotExist(); 
} 

ログイン:

2017-03-09T15:43:06+01:00 ERR (3): Class 'Application\Controller\ClassWhichDoesNotExist' not found {"file":"[...]\\module\\Application\\src\\Application\\Controller\\IndexController.php","line":85} 

それとも、ロガーをグローバルに必要とする場合は、Module.phpファイル内のロガーを初期化できます。

コントローラの動作で例外を記録することはできないと思います。私はがわからないですが、try/catchブロックでアクションがディスパッチされます。

+0

これを修正し、致命的なエラーログを追加しました。私はまだログにthmeが表示されません。サンプルのエンドポイントが機能していないという質問を編集しました。例外は未処理です。 –

+0

私は私の答えを編集..あなたはちょうどロガーを初期化していない。設定ファイルでservice/modelを登録しますが、Zendは最初にこのサービスを呼び出した後にクラスを作成します。おかげさまで – SzymonM

+0

それはそれをした! –

関連する問題