LogLineFormatter : better newline management

master 2.0.1
Julien Rosset 2 years ago
parent db008bf756
commit 839e8330a0

@ -16,6 +16,7 @@
"minimum-stability": "stable", "minimum-stability": "stable",
"require": { "require": {
"php": "^8.1", "php": "^8.1",
"ext-mbstring": "*",
"jrosset/exceptionhelper": "^1.0", "jrosset/exceptionhelper": "^1.0",
"jrosset/lasterrorexception": "^1.0", "jrosset/lasterrorexception": "^1.0",
"monolog/monolog": "^3.3" "monolog/monolog": "^3.3"

@ -17,7 +17,7 @@ class ExceptionLogger extends Logger implements ExceptionLoggerInterface {
public function exception (Level|int $level, Throwable $exception, array $context = []): void { public function exception (Level|int $level, Throwable $exception, array $context = []): void {
$this->addRecord( $this->addRecord(
$level, $level,
ExceptionHelper::toString($exception, false), ExceptionHelper::toString($exception, false) . PHP_EOL,
array_merge( array_merge(
[ [
'exception' => $exception, 'exception' => $exception,

@ -26,6 +26,32 @@ class LogFileFormatter extends LineFormatter {
* @inheritDoc * @inheritDoc
*/ */
public function format (LogRecord $record): string { public function format (LogRecord $record): string {
return preg_replace('/((?<!\\\\)\\\\[rn])+$/', PHP_EOL, parent::format($record)); //region Get then remove newlines at record message end (*before* the formatting)
$messageEndNewlines = '';
$record = $record->with(
message: preg_replace_callback(
'/(?:(?<!\\\\)(?:\\\\[rn]|\\r|\\n))+$/',
function (array $match) use (&$messageEndNewlines): string {
$messageEndNewlines = $match[0];
return '';
},
$this->normalize($record->message)
)
);
//endregion
//region Format the record
$output = parent::format($record);
//endregion
//region Remove newlines at end (introduced by context, extra or record message itself)
$output = preg_replace('/(?:(?<!\\\\)(?:\\\\[rn]|\\r|\\n))+$/', '', $output);
//endregion
//region Re-add the newlines of record message end
$output .= $messageEndNewlines;
//endregion
//region Then finally, replace manual "\r" or "\n" by theirs equivalent
return preg_replace(
'/(?:(?<!\\\\)\\\\[rn])+/', PHP_EOL, $output
);
//endregion
} }
} }

@ -4,6 +4,7 @@ require_once __DIR__ . '/../vendor/autoload.php';
use jrosset\ExtendedMonolog\ExceptionLogger; use jrosset\ExtendedMonolog\ExceptionLogger;
use jrosset\ExtendedMonolog\LogDirectoryHandler; use jrosset\ExtendedMonolog\LogDirectoryHandler;
use Monolog\Formatter\LineFormatter;
use Monolog\Handler\StreamHandler; use Monolog\Handler\StreamHandler;
use Monolog\Level; use Monolog\Level;
@ -11,18 +12,25 @@ use Monolog\Level;
$logger = new ExceptionLogger( $logger = new ExceptionLogger(
'test', 'test',
[ [
new StreamHandler(STDOUT), (new StreamHandler(STDOUT))
->setFormatter(
new LineFormatter(
'[%datetime%] %level_name% : %message%',
'Y-m-d H:i:s',
true
)
),
new LogDirectoryHandler(__DIR__ . '/logs/'), new LogDirectoryHandler(__DIR__ . '/logs/'),
] ]
); );
try { try {
$logger->info('START'); $logger->info('======= test =======' . PHP_EOL . 'START' . PHP_EOL);
throw new RuntimeException('An unexpected error occurs'); throw new RuntimeException('An unexpected error occurs');
/** @noinspection PhpUnreachableStatementInspection */ /** @noinspection PhpUnreachableStatementInspection */
$logger->info('END'); $logger->info('END' . PHP_EOL);
} }
catch (Throwable $exception) { catch (Throwable $exception) {
$logger->exception(Level::Error, $exception); $logger->exception(Level::Error, $exception);

Loading…
Cancel
Save