gupalo / monolog-dbal-logger
Monolog Handler for DBAL
1.10.0
2026-04-10 15:57 UTC
Requires
- php: >=8.4
- ext-json: *
- ext-mbstring: *
- doctrine/dbal: ^4.4
- monolog/monolog: ^3.10
- symfony/console: ^7.4|^8.0
- symfony/event-dispatcher: ^7.4|^8.0
- symfony/http-kernel: ^7.4|^8.0
Requires (Dev)
- doctrine/orm: ^3.6
- easycorp/easyadmin-bundle: ^4.27
- gupalo/symfony-form-transformers: ^1.3
- phpstan/phpstan: ^2.1
- phpunit/phpunit: ^11.5
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 nameint $maxRows = 100000: if you have more rows than$maxRowsthen cleaner will eventually (1 in 100 chances) remove them
Params in MonologDbalCleaner::__construct:
string $table = '_log': table nameint $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 daysint $warningRetentionDays = 7: delete warnings (250 <= level < 400) older than this many daysint $errorRetentionDays = 30: delete errors (level >= 400) older than this many days- Set any retention to
0to 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.