Skip to content

Commit

Permalink
Interpolate the log message also for logged exceptions
Browse files Browse the repository at this point in the history
According to PSR-3 the log message can have placeholders that are
replaced from the context object. Our logger implementation did that for
all PSR-3 logger methods. The only exception was our custom `logException`.

Since PsrLoggerAdapter calls logException when an exception key is
present in the context object, log messages were no longer interpolated.

Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
  • Loading branch information
ChristophWurst authored and backportbot[bot] committed Nov 29, 2021
1 parent b1b5f97 commit 603d623
Showing 1 changed file with 19 additions and 8 deletions.
27 changes: 19 additions & 8 deletions lib/private/Log.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
use OCP\Log\IFileBased;
use OCP\Log\IWriter;
use OCP\Support\CrashReport\IRegistry;
use function strtr;

/**
* logging utilities
Expand Down Expand Up @@ -207,13 +208,7 @@ public function log(int $level, string $message, array $context = []) {
array_walk($context, [$this->normalizer, 'format']);

$app = $context['app'] ?? 'no app in context';

// interpolate $message as defined in PSR-3
$replace = [];
foreach ($context as $key => $val) {
$replace['{' . $key . '}'] = $val;
}
$message = strtr($message, $replace);
$message = $this->interpolateMessage($context, $message);

try {
if ($level >= $minLevel) {
Expand Down Expand Up @@ -316,7 +311,7 @@ public function logException(\Throwable $exception, array $context = []) {

$serializer = new ExceptionSerializer($this->config);
$data = $serializer->serializeException($exception);
$data['CustomMessage'] = $context['message'] ?? '--';
$data['CustomMessage'] = $this->interpolateMessage($context, $context['message'] ?? '--');

$minLevel = $this->getLogLevel($context);

Expand Down Expand Up @@ -377,4 +372,20 @@ public function getLogPath():string {
}
throw new \RuntimeException('Log implementation has no path');
}

/**
* Interpolate $message as defined in PSR-3
*
* @param array $context
* @param string $message
*
* @return string
*/
private function interpolateMessage(array $context, string $message): string {
$replace = [];
foreach ($context as $key => $val) {
$replace['{' . $key . '}'] = $val;
}
return strtr($message, $replace);
}
}

0 comments on commit 603d623

Please sign in to comment.