gupalo/monolog-dbal-logger

Monolog Handler for DBAL

1.6.3 2024-12-02 08:56 UTC

This package is auto-updated.

Last update: 2024-12-02 08:57:23 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 1000 chances) remove them

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

use MarcinJozwikowski\EasyAdminPrettyUrls\Attribute\PrettyRoutesController;

#[PrettyRoutesController(path: 'log')]
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.