yapro/monolog2db

该软件包的最新版本(dev-main)没有可用的许可信息。

处理器将日志记录写入数据库

dev-main 2022-08-19 03:59 UTC

This package is not auto-updated.

Last update: 2024-09-21 08:18:04 UTC


README

处理器将日志记录写入数据库

如果你的数据库宕机,或者你的应用有错误的数据库密码

  • LogRecordHandler 将不会向你的数据库写入
  • LogRecordHandler 将将错误日志写入 LOG_FILE_FOR_UNEXPECTED_ERRORS=/your/file.log

安装

注册环境变量

MYSQL_VERSION=8
MYSQL_HOST=mysql
MYSQL_PORT=3306
MYSQL_DATABASE=database_name
MYSQL_USERNAME=database_username
MYSQL_PASSWORD=database_password
MYSQL_TABLE_OPTIONALLY=system_log
LOG_FILE_FOR_UNEXPECTED_ERRORS=php://stderr

注册日志处理器

services:
  YaPro\Monolog2db\LogRecordHandler:
        arguments:
            - '%env(MYSQL_HOST)%'
            - '%env(MYSQL_PORT)%'
            - '%env(MYSQL_DATABASE)%'
            - '%env(MYSQL_USERNAME)%'
            - '%env(MYSQL_PASSWORD)%'
            - '%env(LOG_FILE_FOR_UNEXPECTED_ERRORS)%'
            - '%env(MYSQL_TABLE_OPTIONALLY)%'

配置 monolog(例如,从文件 config/packages/prod/monolog.yaml)

monolog:
    handlers:
        main:
            type: service
            id: YaPro\Monolog2db\LogRecordHandler
        console:
            type: console
            process_psr_3_messages: false
            channels: ["!event", "!doctrine"]

准备数据库模式

CREATE TABLE system_log (
    id INT AUTO_INCREMENT NOT NULL,
    project_name varchar(255) not null,
    source_name varchar(255) not null,
    level_name varchar(255) not null,
    message TEXT not null,
    datetime DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
    http_request_id varchar(255) not null,
    channel varchar(255) not null,
    context LONGTEXT not null,
    extra LONGTEXT not null, 
    PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB;

为了使 doctrine 忽略 system_log 表,需要指定它

doctrine:
    dbal:
        default_connection: connection_mysql
        connections:
            connection_mysql:
                # игнорируем таблицы начинающиеся с префикса monolog https://symfony.com.cn/bundles/DoctrineMigrationsBundle/current/index.html#manual-tables
                schema_filter: ~^(?!system_log)~
                # для нескольких таблиц попробовать: ~^(?!(monolog|sessions))~
                # альтернатива: app/console doctrine:migrations:diff --filter-expression=/^prefix_/

并且在启动迁移之前不要忘记删除该表

# create db schemes:
bin/console doctrine:schema:drop --full-database --force -v
bin/console dbal:run-sql "drop table if exists system_log;"
bin/console doctrine:migrations:migrate --no-interaction -v

测试

docker build -t yapro/monolog2db:latest -f ./Dockerfile ./
docker run --rm -v $(pwd):/app yapro/monolog2db:latest bash -c "cd /app \
  && composer install --optimize-autoloader --no-scripts --no-interaction \
  && /app/vendor/bin/phpunit /app/tests"

开发

docker build -t yapro/monolog2db:latest -f ./Dockerfile ./
docker run -it --rm -v $(pwd):/app -w /app yapro/monolog2db:latest bash
composer install -o