Skip to content

Bug: DebugBar's Logs collector not compatible with 3rd-Party PSR-3 loggers #10170

@performrumpf

Description

@performrumpf

PHP Version

8.2

CodeIgniter4 Version

4.6.5

CodeIgniter4 Installation Method

Composer (using codeigniter4/appstarter)

Which operating systems have you tested for this bug?

Linux, Windows

Which server did you use?

apache

Environment

development

Database

No response

What happened?

We replaced CI4 Logger with Monolog Logger (3.9.0) for its flexibility (mostly so that we can log in console and in ECS format).

We recently updated the CI version from 4.6.3 to 4.6.5. When running the application in "development" environment, we encountered the following error messages:

Undefined property: Monolog\Logger::$logCache

  1. SYSTEMPATH\Debug\Toolbar\Collectors\Logs.php at line 95
  2. SYSTEMPATH\Debug\Toolbar\Collectors\Logs.php : 60
  3. SYSTEMPATH\Debug\Toolbar\Collectors\BaseCollector.php : 228
  4. SYSTEMPATH\Debug\Toolbar.php : 95
  5. SYSTEMPATH\Debug\Toolbar.php : 390
  6. SYSTEMPATH\Filters\DebugToolbar.php : 44
  7. SYSTEMPATH\Filters\Filters.php : 278
  8. SYSTEMPATH\Filters\Filters.php : 225
  9. SYSTEMPATH\CodeIgniter.php : 525
  10. SYSTEMPATH\CodeIgniter.php : 354
  11. SYSTEMPATH\Boot.php : 363
  12. SYSTEMPATH\Boot.php : 68
  13. FCPATH\index.php : 59

Steps to Reproduce

We followed the guidelines in Using Third-Party Loggers to create our own logger service.

namespace Config;

use CodeIgniter\Config\BaseService;
use Monolog\Formatter\LineFormatter;
use Monolog\Handler\StreamHandler;
use Monolog\Processor\PsrLogMessageProcessor;
use Monolog\Logger;
use Psr\Log\LoggerInterface;

class Services extends BaseService
{
    public static function logger(bool $getShared = true): LoggerInterface
    {
        if ($getShared) {
            return static::getSharedInstance('logger');
        }
        
        $formatter = new LineFormatter();
        $formatter->setDateFormat(DATE_RFC3339_EXTENDED);
        
        $handler = new StreamHandler(WRITEPATH . 'logs/app.log', 'debug');
        $handler->setFormatter($formatter);

        $logger = new Logger('sample-app');
        $logger->pushHandler($handler);
        $logger->pushProcessor(new PsrLogMessageProcessor());

        return $logger;
    }
}

This setup would create an error of the Logs collector is enabled in Config\Toolbar. Disabling it works fine

namespace Config;

class Toolbar extends BaseConfig
{
    public array $collectors = [
        Timers::class,
        Database::class,
        Logs::class,
        Views::class,
        // \CodeIgniter\Debug\Toolbar\Collectors\Cache::class,
        Files::class,
        Routes::class,
        Events::class,
    ];
}

Expected Output

I'm not sure if the Logs collector should work with 3rd-party PSR-3 Loggers or not, but if not, maybe a check would be nice if Logger->logCache actually exists.

We expect that there are no issues with the DebugToolbar if support for 3rd-party loggers is possible.

Anything else?

I think the problem already occurred first since version 4.6.4, though not tested yet.

Above's code example created the following log lines in writable/logs/app.log (except for the Route and Filter parameter parts).

[2026-05-07T09:14:58.602+01:00] sample-app.CRITICAL: ErrorException: Undefined property: Monolog\Logger::$logCache [Method: GET, Route: dashboard/deliveries/index/false] in SYSTEMPATH\Debug\Toolbar\Collectors\Logs.php on line 95.  1 SYSTEMPATH\Debug\Toolbar\Collectors\Logs.php(95): CodeIgniter\Debug\Exceptions->errorHandler(2, 'Undefined property: Monolog\\Logger::$logCache', 'C:\\Users\\christian.rumpf\\Documents\\GitHub\\valde-dettol\\htdocs\\vendor\\codeigniter4\\framework\\system\\Debug\\Toolbar\\Collectors\\Logs.php', 95)  2 SYSTEMPATH\Debug\Toolbar\Collectors\Logs.php(60): CodeIgniter\Debug\Toolbar\Collectors\Logs->collectLogs()  3 SYSTEMPATH\Debug\Toolbar\Collectors\BaseCollector.php(228): CodeIgniter\Debug\Toolbar\Collectors\Logs->display()  4 SYSTEMPATH\Debug\Toolbar.php(95): CodeIgniter\Debug\Toolbar\Collectors\BaseCollector->getAsArray()  5 SYSTEMPATH\Debug\Toolbar.php(390): CodeIgniter\Debug\Toolbar->run(1778141697.83611, 0.7603, Object(CodeIgniter\HTTP\IncomingRequest), Object(CodeIgniter\HTTP\Response))  6 SYSTEMPATH\Filters\DebugToolbar.php(44): CodeIgniter\Debug\Toolbar->prepare(Object(CodeIgniter\HTTP\IncomingRequest), Object(CodeIgniter\HTTP\Response))  7 SYSTEMPATH\Filters\Filters.php(278): CodeIgniter\Filters\DebugToolbar->after(Object(CodeIgniter\HTTP\IncomingRequest), Object(CodeIgniter\HTTP\Response), null)  8 SYSTEMPATH\Filters\Filters.php(225): CodeIgniter\Filters\Filters->runAfter([...])  9 SYSTEMPATH\CodeIgniter.php(525): CodeIgniter\Filters\Filters->run('dashboard/deliveries/index/false', 'after') 10 SYSTEMPATH\CodeIgniter.php(354): CodeIgniter\CodeIgniter->handleRequest(null, Object(Config\Cache), false) 11 SYSTEMPATH\Boot.php(363): CodeIgniter\CodeIgniter->run() 12 SYSTEMPATH\Boot.php(68): CodeIgniter\Boot::runCodeIgniter(Object(CodeIgniter\CodeIgniter)) 13 FCPATH\index.php(59): CodeIgniter\Boot::bootWeb(Object(Config\Paths)) {"message":"Undefined property: Monolog\\Logger::$logCache","routeInfo":"[Method: GET, Route: dashboard/deliveries/index/false]","exFile":"SYSTEMPATH\\Debug\\Toolbar\\Collectors\\Logs.php","exLine":95,"trace":" 1 SYSTEMPATH\\Debug\\Toolbar\\Collectors\\Logs.php(95): CodeIgniter\\Debug\\Exceptions->errorHandler(2, 'Undefined property: Monolog\\\\Logger::$logCache', 'C:\\\\Users\\\\christian.rumpf\\\\Documents\\\\GitHub\\\\valde-dettol\\\\htdocs\\\\vendor\\\\codeigniter4\\\\framework\\\\system\\\\Debug\\\\Toolbar\\\\Collectors\\\\Logs.php', 95)\n 2 SYSTEMPATH\\Debug\\Toolbar\\Collectors\\Logs.php(60): CodeIgniter\\Debug\\Toolbar\\Collectors\\Logs->collectLogs()\n 3 SYSTEMPATH\\Debug\\Toolbar\\Collectors\\BaseCollector.php(228): CodeIgniter\\Debug\\Toolbar\\Collectors\\Logs->display()\n 4 SYSTEMPATH\\Debug\\Toolbar.php(95): CodeIgniter\\Debug\\Toolbar\\Collectors\\BaseCollector->getAsArray()\n 5 SYSTEMPATH\\Debug\\Toolbar.php(390): CodeIgniter\\Debug\\Toolbar->run(1778141697.83611, 0.7603, Object(CodeIgniter\\HTTP\\IncomingRequest), Object(CodeIgniter\\HTTP\\Response))\n 6 SYSTEMPATH\\Filters\\DebugToolbar.php(44): CodeIgniter\\Debug\\Toolbar->prepare(Object(CodeIgniter\\HTTP\\IncomingRequest), Object(CodeIgniter\\HTTP\\Response))\n 7 SYSTEMPATH\\Filters\\Filters.php(278): CodeIgniter\\Filters\\DebugToolbar->after(Object(CodeIgniter\\HTTP\\IncomingRequest), Object(CodeIgniter\\HTTP\\Response), null)\n 8 SYSTEMPATH\\Filters\\Filters.php(225): CodeIgniter\\Filters\\Filters->runAfter([...])\n 9 SYSTEMPATH\\CodeIgniter.php(525): CodeIgniter\\Filters\\Filters->run('dashboard/deliveries/index/false', 'after')\n10 SYSTEMPATH\\CodeIgniter.php(354): CodeIgniter\\CodeIgniter->handleRequest(null, Object(Config\\Cache), false)\n11 SYSTEMPATH\\Boot.php(363): CodeIgniter\\CodeIgniter->run()\n12 SYSTEMPATH\\Boot.php(68): CodeIgniter\\Boot::runCodeIgniter(Object(CodeIgniter\\CodeIgniter))\n13 FCPATH\\index.php(59): CodeIgniter\\Boot::bootWeb(Object(Config\\Paths))"} []

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugVerified issues on the current code behavior or pull requests that will fix them

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions