2017-07-17 1 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']; 
}; 

Quand jamais une exception se produit, je reçois une seule ligne dans le journal des erreurs. Peut-être que ma mémoire va floue mais la journalisation d'erreur PHP par défaut serait bien sur un format plus plusieurs lignes ...Comment enregistrer des exceptions avec des sauts de ligne appropriés en utilisant Monolog avec Slim 3?

est-il un moyen de le formater bien? Ou dois-je le formater manuellement en utilisant quelque chose comme:

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

Même avec ce qui précède, la trace apparaît comme une seule ligne.

Répondre

0

est ici un travail autour de l'utilisation regex:

$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

Ceci est un paramètre Monologue Formatteur et Slim n'a rien à dire dans ce domaine.

La façon de le faire est bien utiliser un Formateurs en Monologue.

Le formatter par défaut est le LineFormatter

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

Comme vous pouvez le voir le troisième paramètre est $allowInlineLineBreaks de sorte que vous pouvez définir que true. Par exemple:

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