2017-07-17 2 views
3
$container['logger'] = function (\Slim\Container $c) { 
    $settings = $c->get('settings')['logger']; 
    $logger = new Monolog\Logger($settings['name']); 
    $logger->pushProcessor(new Monolog\Processor\UidProcessor()); 
    $logger->pushHandler(new Monolog\Handler\StreamHandler($settings['path'], $settings['level'])); 
    return $logger; 
}; 

$container['errorHandler'] = function (\Slim\Container $container) { 
    return function (\Slim\Http\Request $request, \Slim\Http\Response $response, \Exception $exception) use ($container) { 
     /** @var \Monolog\Logger $monoLog */ 
     $monoLog = $container->logger; 
     $monoLog->addError((string)$exception); 

     $response->getBody()->rewind(); 
     return $response->withStatus(500) 
      ->withHeader('Content-Type', 'text/html') 
      ->write("Oops, something's gone wrong!"); 
    }; 
}; 

$container['phpErrorHandler'] = function ($container) { 
    return $container['errorHandler']; 
}; 

これまでに例外が発生した場合、エラーログには1行しか表示されません。多分、私の記憶は曖昧になっているかもしれませんが、デフォルトのPHPエラーログは、複数の行にうまく書式を設定します...Slim 3のMonologを使用して、適切な改行で例外を記録するにはどうすればよいですか?

それをきれいにフォーマットする方法はありますか?または、次のような形式で手動で書式設定してください:

$monoLog->addError($exception->getMessage()); 
    $monoLog->addError($exception->getTraceAsString()); 
    $monoLog->addError($exception->getFile()); 
    $monoLog->addError($exception->getCode()); 
    $monoLog->addError($exception->getLine()); 

上記の場合でも、トレースは1行で表示されます。ここで

答えて

0

は、正規表現を使用して周りの仕事です:

$traceStrings = preg_split(
      "/(#\d+)/", 
      $exception->getTraceAsString(), 
      null, 
      PREG_SPLIT_DELIM_CAPTURE 
    ); 
/** @var \Monolog\Logger $monoLog */ 
$monoLog = $container->logger; 
$monoLog->addError($exception->getMessage()); 
$monoLog->addError($exception->getTraceAsString()); 
foreach ($traceStrings as $ts) 
    $monoLog->addError($ts); 
$monoLog->addError($exception->getFile()); 
$monoLog->addError($exception->getCode()); 
$monoLog->addError($exception->getLine()); 
2

これはモノローグフォーマッタの設定で、スリムは、この中に何の発言権を持っていません。

これをうまくやり遂げる方法は、MonoLogでFormattersを使用することです。あなたは三番目のパラメータは$allowInlineLineBreaksので、あなたがtrueにそれを設定することができますで見ることができるように

デフォルトのフォーマッタはLineFormatter

public function __construct($format = null, $dateFormat = null, $allowInlineLineBreaks = false, $ignoreEmptyContextAndExtra = false) 

です。 例:

$handler = new Monolog\Handler\StreamHandler($settings['path'], $settings['level']); 
$lineFormatter = new \Monolog\Formatter\LineFormatter(null, null, true); 
$handler->setFormatter($lineFormatter); 
$logger->pushHandler($handler); 
関連する問題