* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * @link http://www.temando.com/ */ class Anonymizer implements LogAnonymizerInterface { /** * @var array | string[] */ private $secrets; /** * Anonymizer constructor. * @param string[] $secrets */ public function __construct($secrets = []) { $this->secrets = $secrets; } /** * Strip sensitive strings from message by given property names. * * @param string $message * @return string */ public function anonymize($message) { $patternTemplate = <<<'REGEX' /(?(DEFINE) (?(?>\{\s*(?>(?&pair)(?>\s*,\s*(?&pair))*)?\s*\})) (?(?>(?&STRING)\s*:\s*(?&value))) (?(?>\[\s*(?>(?&value)(?>\s*,\s*(?&value))*)?\s*\])) (?(?>true|false|null|(?&STRING)|(?&NUMBER)|(?&object)|(?&array))) (?(?>"(?>\\\\(?>["\\\\\/bfnrt]|u[a-fA-F0-9]{4})|[^"\\\\\0-\x1F\x7F]+)*")) (?(?>-?(?>0|[1-9][0-9]*)(?>\.[0-9]+)?(?>[eE][+-]?[0-9]+)?)) ) (?\"%s\":\s*)(?(?&value))/xu REGEX; foreach ($this->secrets as $key => $newValue) { $pattern = sprintf($patternTemplate, $key); $message = preg_replace_callback( $pattern, function ($matches) use ($newValue) { return $matches['key'] . "\"$newValue\""; }, $message ); } return $message; } /** * Processor for Monolog log records. * * @param mixed[] $record * @return mixed[] */ public function __invoke(array $record) { $record['message'] = $this->anonymize($record['message']); return $record; } }