Skip to content

Commit

Permalink
Updating the logging code to not throw away all class information (#1493
Browse files Browse the repository at this point in the history
)

* Updating the logging code to not throw away all class information

We ran into a problem described in this PR:
#1490 After some research I found that the
root of the problem is this function json_encode'ing `$record` when the contents
of `$record` may contain objects that do not support `JsonSerializable` but that
do implement `toString()`. After a conversation w/ Joe it's been decided that
our Logging API will be to support the logging of arrays w/ objects that
implement a `toString()` function. The eagle-eyed may notice that this solution
differs from the one I put forth in the above PR. The reason being that the
original solution only supported the use case of having an array w/ top level
value objects and would not work as expected if a nested array is supplied with
an object that implements `toString()`.

* Adding Additional Documentation

Per @jpwhite4, it's important that we document that our Logger supports logging
both strings and arrays, and if an array is provided that contains objects,
those objects will be converted to strings via the `__toString` function.

Co-authored-by: Ryan Rathsam <[email protected]>
  • Loading branch information
ryanrath and Ryan Rathsam authored Feb 10, 2021
1 parent 792f9c7 commit 20a314e
Showing 1 changed file with 24 additions and 1 deletion.
25 changes: 24 additions & 1 deletion classes/CCR/Logger.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
* messages while still utilizing Monolog but this will only be the case for loggers retrieved from CCR\Log::factory|singleton
* or if code instantiates this class directly.
*
* Note: This logger supports string and array "messages". If an array is provided that contains objects, then this class
* will use the __toString() function to convert the object to a string.
*
* @package CCR
*/
class Logger extends \Monolog\Logger implements LoggerInterface
Expand Down Expand Up @@ -44,8 +47,28 @@ public function addRecord($level, $message, array $context = array())
protected function extractMessage($record)
{
if (is_array($record)) {
return json_encode($record);
return json_encode($this->recursivelyStringifyObjects($record));
}
return json_encode(array('message' => $record));
}

/**
* This function recursively iterates over the provided $array keys and values. If a value is an object it replaces
* the object with it's cast string value.
*
* @param array $array The array to be recursively iterated over
*
* @return array returns the provided $array w/ any object values cast to strings.
*/
protected function recursivelyStringifyObjects(&$array)
{
while (list($key, $value) = each($array)) {
if (is_object($value)) {
$array[$key] = (string) $value;
} elseif (is_array($value)) {
$array[$key] = $this->recursivelyStringifyObjects($value);
}
}
return $array;
}
}

0 comments on commit 20a314e

Please sign in to comment.