beste/psr-testlogger

PSR-3 compliant test logger for developers who like tests and want to check if their application logs messages as they expect.

Maintainers

πŸ‘ jeromegamez

Package info

github.com/beste/psr-testlogger

pkg:composer/beste/psr-testlogger

Statistics

Installs: 23 366

Dependents: 3

Suggesters: 0

Stars: 2

Open Issues: 0

1.0.0 2022-09-24 15:52 UTC

Requires

Suggests

None

Provides

None

Conflicts

None

Replaces

None

MIT 405cf168378fdb0977f34d9abc36a4a31bf29315

  • JΓ©rΓ΄me Gamez <jerome.woop@gamez.name>

logloggingtestingpsr-3

This package is auto-updated.

Last update: 2026-06-27 15:29:10 UTC


README

PSR-3 compliant test logger for developers who like tests and want to check if their application logs messages as they expect.

πŸ‘ Current version
πŸ‘ Packagist PHP Version Support
πŸ‘ Monthly Downloads
πŸ‘ Total Downloads
πŸ‘ Tests
πŸ‘ Sponsor

Installation

composer require --dev beste/psr-testlogger

Usage

In your unit tests, inject the Beste\Psr\Log\TestLogger class into tested subjects that expect a Prs\Log\LoggerInterface.

The test logger records all log messages and exposes them via the records property which is an instance of Beste\Psr\Log\Records.

use Beste\Psr\Log\Record;
use Beste\Psr\Log\TestLogger;
use Psr\Log\LoggerInterface;
use Psr\Log\LogLevel;

final class Subject
{
 public function __construct(
 public readonly LoggerInterface $logger
 ) {}
 
 public function doSomething(): void
 {
 $this->logger->info('Doing something');
 $this->logger->warning('1st problem');
 $this->logger->warning('2nd problem');
 $this->logger->critical('Uh oh!');
 }
}

final class SubjectTest extends \PHPUnit\Framework\TestCase
{
 private TestLogger $logger;
 private Subject $subject;
 
 protected function setUp() : void{
 $this->logger = TestLogger::create();
 }
 
 /** @test */
 public function it_does_something(): void
 {
 $this->subject->doSomething();
 
 self::assertCount(4, $this->logger->records);
 
 self::assertEqualsCanonicalizing(
 [LogLevel::INFO, LogLevel::WARNING, LogLevel::CRITICAL],
 $this->logger->records->levels()
 );
 
 self::assertTrue($this->logger->records->includeMessagesWithLevel('info'));
 self::assertCount(1, $this->logger->records->filteredByLevel('info'));
 self::assertCount(3, $this->logger->records->filteredByLevel('info', 'warning'));
 
 self::assertTrue($this->logger->records->includeMessagesContaining('problem'));
 self::assertCount(2, $this->logger->records->filteredByMessageContaining('problem'));
 
 self::assertTrue($this->logger->records->includeMessagesMatching('/^\d{1,}(st|nd)/i'));
 self::assertCount(2, $this->logger->records->filteredByMessageMatching('/^\d{1,}(st|nd)/i'));
 
 // You can filter by your own criteria. If you discover criteria not natively
 // covered by the test logger, please consider a pull request.
 self::assertTrue($this->logger->records->includeMessagesBy(fn (Record $r) => str_contains($r->level, 'n')));
 self::assertCount(3, $this->logger->records->filteredBy(fn (Record $r) => str_contains($r->level, 'n'))); 
 }
}

License

This project is published under the MIT License.