Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用Slim 3的Monolog记录具有适当换行符的异常?_Php_Slim_Monolog - Fatal编程技术网

Php 如何使用Slim 3的Monolog记录具有适当换行符的异常?

Php 如何使用Slim 3的Monolog记录具有适当换行符的异常?,php,slim,monolog,Php,Slim,Monolog,每当发生异常时,我都会在错误日志中看到一行。也许我的记忆变得模糊了,但是默认的PHP错误日志将在多行上很好地格式化 有没有一种方法可以很好地格式化它?或者我是否使用以下方式手动格式化它: $container['logger'] = function (\Slim\Container $c) { $settings = $c->get('settings')['logger']; $logger = new Monolog\Logger($settings['name'])

每当发生异常时,我都会在错误日志中看到一行。也许我的记忆变得模糊了,但是默认的PHP错误日志将在多行上很好地格式化

有没有一种方法可以很好地格式化它?或者我是否使用以下方式手动格式化它:

$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'];
};

即使使用上面的命令,跟踪也会显示为一行。

这里有一个使用正则表达式的解决方法:

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

这是一个独白格式化设置和斯利姆没有发言权在这方面

很好地做到这一点的方法是在独白中使用格式化程序

默认的格式化程序是

如您所见,第三个参数是
$allowinlinebreaks
,因此您可以将其设置为true。 例如:

public function __construct($format = null, $dateFormat = null, $allowInlineLineBreaks = false, $ignoreEmptyContextAndExtra = false)
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);