如何使用Monolog和Slim 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'];
};
当发生异常时,我会在错误日志中看到一行。也许我的记忆是模糊的,但默认的PHP错误日志会很好地格式化多行的东西...如何使用Monolog和Slim 3合适的换行符记录异常?
有没有一种方法来很好地格式化?
$monoLog->addError($exception->getMessage());
$monoLog->addError($exception->getTraceAsString());
$monoLog->addError($exception->getFile());
$monoLog->addError($exception->getCode());
$monoLog->addError($exception->getLine());
即使有微量上面出现一行:还是我必须使用类似手动格式化。
答
这里是一个工作使用正则表达式周围:
$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());
答
这是一个独白格式化设置和斯利姆没有发言权在此。
很好地做到这一点的方法是在MonoLog中使用格式化程序。
默认格式是LineFormatter
public function __construct($format = null, $dateFormat = null, $allowInlineLineBreaks = false, $ignoreEmptyContextAndExtra = false)
正如你所看到的第三个参数是$allowInlineLineBreaks
,所以你可以设置为true。例如:
$handler = new Monolog\Handler\StreamHandler($settings['path'], $settings['level']);
$lineFormatter = new \Monolog\Formatter\LineFormatter(null, null, true);
$handler->setFormatter($lineFormatter);
$logger->pushHandler($handler);