簡體   English   中英

如何使用Monolog with Slim 3使用適當的換行符記錄異常?

[英]How do I log exceptions with appropriate linebreaks using Monolog with 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->addError($exception->getMessage());
    $monoLog->addError($exception->getTraceAsString());
    $monoLog->addError($exception->getFile());
    $monoLog->addError($exception->getCode());
    $monoLog->addError($exception->getLine());

即使有上述情況,跡線也會顯示為單行。

這是一個Monolog Formatter設置,Slim在此沒有發言權。

很好地做到這一點的方法是在MonoLog中使用Formatters。

默認格式化程序是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);

這是一個使用正則表達式的工作:

$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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM