northrook/logger

Buffering PSR-3 logger that collapses repeated log shapes into shared entries

Maintainers

Package info

codeberg.org/northrook/logger

Issues

pkg:composer/northrook/logger

Transparency log

Statistics

Installs: 400

Dependents: 6

Suggesters: 0

dev-main 2026-07-16 23:04 UTC

This package is auto-updated.

Last update: 2026-07-16 22:06:58 UTC


README

Buffering PSR-3 logger that collapses repeated log shapes into shared entries.

Requirements

Installation

composer require northrook/logger

Quick start

use Northrook\Logger;

$logger = new Logger();
$logger->info('User login', ['userId' => 1]);
$logger->info('User login', ['userId' => 2]); // same shape → 1 entry, 2 occurrences
$logger->warning('Cache miss');

$logger->count();        // 2 unique entries
$logger->occurrences();  // 3 log calls

foreach ($logger->getEntries() as $entry) {
    $entry->level;
    $entry->message;
    $entry->getContext(); // all occurrence contexts
}

Aggregation

Identity is level + message + context keys (order-insensitive). Context values are stored per occurrence on the shared entry.

CallResult
info('hi', ['userId' => 1]) then info('hi', ['userId' => 2])One entry, two occurrences
info('hi') then info('hi', ['userId' => 1])Two entries (empty ≠ keyed)
info('hi', ['b' => 1, 'a' => 2]) then info('hi', ['a' => 9, 'b' => 8])One entry (key order ignored)

Messages are stored as-is — no {placeholder} interpolation.

LogEntry::$timestamp is the last-seen occurrence.

Reading entries

getEntries() returns a frozen LoggerEntries snapshot, keyed by signature. The cache is cleared on the next log() call.

Property / methodMeaning
$entries / iteratorLogEntry values keyed by signature
$count / count()Unique aggregated entries
$occurrencesCountTotal log() calls at export time
LogEntry::getContext()Context from every occurrence
LogEntry::getContext(true)Context from the latest occurrence only

Levels

log() accepts LogLevel, numeric values (100600), or PSR-3 / case-name strings (debug, DEBUG) via LogLevel::resolve().

use Northrook\Logger\LogLevel;

$logger->log(LogLevel::WARNING, 'Slow query');
$logger->log('warning', 'Slow query');
$logger->log(300, 'Slow query');

Development

composer test
composer phpstan

License

BSD-3-Clause. See LICENSE.