gupalo/monolog-dbal-logger

Monolog Handler for DBAL

Maintainers

Package info

github.com/gupalo/monolog-dbal-logger

pkg:composer/gupalo/monolog-dbal-logger

Statistics

Installs: 16 869

Dependents: 1

Suggesters: 0

Stars: 0

Open Issues: 0

1.10.0 2026-04-10 15:57 UTC

README

Installation

Add to your project via composer:

composer require gupalo/monolog-dbal-logger

Create log table.

CREATE TABLE `_log` (
    `id`                    bigint UNSIGNED NOT NULL AUTO_INCREMENT,
    `created_at`            datetime NOT NULL,
    `level`                 smallint NOT NULL DEFAULT 0,
    `level_name`            enum('debug','info','notice','warning','error','critical','alert','emergency') NULL DEFAULT NULL,
    `channel`               varchar(255) NOT NULL DEFAULT '',
    `message`               varchar(1024) NOT NULL DEFAULT '',
    `context`               text NULL DEFAULT NULL,
    PRIMARY KEY (`id`),
    INDEX `log_created_at_level` (`created_at`, `level`) USING BTREE
) DEFAULT CHARACTER SET=utf8mb4 COLLATE=utf8mb4_general_ci;

Example

$connection is Doctrine\DBAL\Connection

$handler = new \Gupalo\MonologDbalLogger\MonologDbalLogger($connection);
$logger = new \Monolog\Logger();
$logger->pushHandler($handler);

$logger->addWarning('You might not read the docs', ['page' => 17, 'username' => 'guest']);

Symfony

Configuration example:

services.yaml

Gupalo\MonologDbalLogger\Symfony\ErrorLogListener:
    tags: [ {name: 'kernel.event_subscriber'} ]

monolog.dbal_handler:
    class: 'Gupalo\MonologDbalLogger\MonologDbalLogger'
    public: true
    bind:
        $connection: '@doctrine.dbal.default_connection'
        $level: 200
    tags: ['monolog.logger']

monolog.yaml

monolog:
    handlers:
        db:
            type: service
            id: 'monolog.dbal_handler' # note - no "@"
            channels: ["!event", "!request", "!security"]

Configure

Params in MonologDbalLogger::__construct:

  • string $table = '_log': table name
  • int $maxRows = 100000: if you have more rows than $maxRows then cleaner will eventually (1 in 100 chances) remove them

Params in MonologDbalCleaner::__construct:

  • string $table = '_log': table name
  • int $maxRows = 100000: keep at most this many rows (only deletes info-level rows, level < 250)
  • int $infoRetentionDays = 1: delete info logs (level < 250) older than this many days
  • int $warningRetentionDays = 7: delete warnings (250 <= level < 400) older than this many days
  • int $errorRetentionDays = 30: delete errors (level >= 400) older than this many days
  • Set any retention to 0 to disable that rule

Extend

You may extend MonologDbalLogger and add your own logic. See MyMonologDbalLogger as an example. If you add additional fields, remember to change table creation SQL.

Table:

CREATE TABLE `_log` (
    `id`                    bigint UNSIGNED NOT NULL AUTO_INCREMENT,
    `created_at`            datetime NOT NULL,
    `level`                 smallint NOT NULL DEFAULT 0,
    `level_name`            enum('debug','info','notice','warning','error','critical','alert','emergency') NULL DEFAULT NULL,
    `channel`               varchar(255) NOT NULL DEFAULT '',
    `message`               varchar(1024) NOT NULL DEFAULT '',
    `context`               text NULL DEFAULT NULL,
    `method`                varchar(255) NULL DEFAULT NULL,
    `cmd`                   varchar(255) NULL DEFAULT NULL,
    `uid`                   varchar(32) NULL DEFAULT NULL,
    `count`                 int NULL DEFAULT NULL,
    `time`                  float NULL DEFAULT NULL,
    `exception_class`       varchar(1024) NULL DEFAULT NULL,
    `exception_message`     varchar(1024) NULL DEFAULT NULL,
    `exception_line`        varchar(1024) NULL DEFAULT NULL,
    `exception_trace`       text NULL,
    PRIMARY KEY (`id`),
    INDEX `log_created_at_level` (`created_at`, `level`) USING BTREE
) DEFAULT CHARACTER SET=utf8mb4 COLLATE=utf8mb4_general_ci;

EasyAdmin

Add to menu

yield MenuItem::linkToCrud('Log', 'fa-solid fa-file-waveform', Log::class);

Add to config/packages/doctrine.yaml

doctrine:
    orm:
        mappings:
            # ...here is "App", add below
            Gupalo:
                is_bundle: false
                dir: '%kernel.project_dir%/vendor/gupalo/monolog-dbal-logger/src/Entity'
                prefix: 'Gupalo\MonologDbalLogger\Entity'
                alias: Gupalo

Create controller. Override if needed

class LogCrudController extends \Gupalo\MonologDbalLogger\EasyAdmin\Controller\LogCrudController
{
}

Add to config/services.yaml

services:
    Gupalo\MonologDbalLogger\Repository\LogRepository:
        tags: [ 'doctrine.repository_service' ]

Other

See tests.