Open
Description
Monolog version: 1.25.3
I'm using DeduplicationHandler to avoid duplicated deprecation messages but it still passes all entries via $this->handler->handleBatch($this->buffer);
to the next handler (RotatingFileHandler). I think this is because of the following line:
$passthru = $passthru || !$this->isDuplicate($record);
The first call to isDuplicate() method results in false
because the duplication store file does not exists yet, so $passthru
becomes true
and will never be false
again.
I'm not sure but I think the code should be modified a bit to something like this:
$passthru = null;
$deduplicatedBuffer = [];
foreach ($this->buffer as $record) {
if ($record['level'] >= $this->deduplicationLevel) {
$isDuplicate = $this->isDuplicate($record);
$passthru = $passthru || !$isDuplicate;
if ($passthru) {
$this->appendRecord($record);
}
if (!$isDuplicate) {
$deduplicatedBuffer[] = $record;
}
}
}
if (true === $passthru) {
$this->handler->handleBatch($deduplicatedBuffer);
} elseif (null === $passthru) {
$this->handler->handleBatch($this->buffer);
}
My config:
deprecations:
type: fingers_crossed
# Include messages with level >= "info".
action_level: info
channels: ["php"]
handler: deprecation_filter
deprecation_filter:
type: filter
# Exclude messages with level higher than "info".
max_level: info
channels: ["php"]
handler: deduplicated
nested: true
deduplicated:
type: deduplication
deduplication_level: info
time: 60
handler: deprecations_rotated
nested: true
deprecations_rotated:
type: rotating_file
path: "%kernel.logs_dir%/%kernel.environment%.deprecations.log"
max_files: 2
nested: true