forci/catchable-bundle

收集未处理的异常的包

安装次数: 9,097

依赖关系: 0

建议者: 0

安全: 0

星标: 0

关注者: 3

分支: 0

开放性问题: 5

语言:CSS

类型:symfony-bundle


README

按常规注册此包并安装其路由。

要使此包有意义,您需要创建一个单独的连接和一个单独的实体管理器。从0.7版本开始,您不再需要为此包进行任何配置。请遵循 https://symfony.com.cn/doc/4.4/doctrine/multiple_entity_managers.html 并将 ForciCatchableBundle 映射到您的单独EM。

更好的做法是创建一个完全独立的数据库。拥有一个单独的实体管理器还意味着您将无法使用 DoctrineMigrationsBundle 迁移它,因为它不支持多个实体管理器(至少据我所知)。因此,根据您的项目部署策略和/或需求创建/更新您的独立数据库。

上述配置使用默认配置,如果出现Doctrine抛出的异常,将无法正常工作,因为它也会关闭负责将其写入数据库的实体管理器。

警告:此包并不打算替代您的文件或日志记录。它是为了与您的现有基础设施协同工作,并通过您的管理界面更轻松、更优雅地查看错误。

版本 >= ~0.6

在您的 config_prod.yml 中

monolog:
    handlers:
        main:
            type:         fingers_crossed
            action_level: critical
            handler:      grouped
            # 404 and 405 can build up tons if unnecessary data
            # You may be better off tracking those from your web server's logs
            excluded_http_codes: [404, 405]
            # Alternatively, exclude just 404s at given paths
#            excluded_404s:
#                # regex: exclude all 404 errors from the logs
#                - ^/
        grouped:
            type:    group
            members: [streamed, buffered, catchable]
        # Log errors to a file
        streamed:
            type:  stream
            path:  "%kernel.logs_dir%/%kernel.environment%.log"
            level: debug
            include_stacktraces: true
        # Buffer errors to be sent via swift mailer
        buffered:
            type:    buffer
            handler: swift
        # Actual swift mailer handler that gets invoked when action_level: critical
        # from the main handler occurs
        swift:
            type:       swift_mailer
            from_email: errors@some-domain.com
            to_email:   "dev1@some-domain.com"
            # or list of recipients
            # to_email:   [dev1@some-domain.com, dev2@some-domain.com, ...]
            subject:    "[My Project] An Error in PROD Occurred!"
            level:      debug
            include_stacktraces: true
        # CatchableBundle's buffer handler. Logs are formatted using the hardcoded \Monolog\Formatter\ScalarFormatter
        # and stored locally in an array. After that, upon an Exception, the `Forci\Bundle\Catchable\Subscriber\ExceptionSubscriber`
        # is invoked, and fetches the logs from this buffer handler. This allows you to have your Symfony logs persisted
        # together with the serialized \Throwable instance.
        catchable:
            type: service
            id: forci.catchable.monolog.handler.log_buffer

您还可以通过 FilterHandler 将 Catchable 的日志传递过去,以去除冗余内容,如弃用信息。这允许您仅持久化关键错误信息,但将弃用信息记录到文件中。您可以使用 accepted_levels 或 min_level / max_level 中的任何一个,这取决于您的需求。请注意,如果允许弃用信息持久化,您可能会在许多 404 错误后快速用冗余数据填满数据库。在将来,将添加类似忽略错误(如上述 HttpNotFoundException)的功能。

        catchable:
            type: filter
            handler: catchable_real
            # Either
#            min_level: debug
#            max_level: emergency
            # Or
            accepted_levels: [debug, critical]
        catchable_real:
            type: service
            id: forci.catchable.monolog.handler.log_buffer

或者,您可以使用过滤器、缓冲区或任何其他处理程序,而不是 fingers_crossed。请注意:当使用缓冲区时,它必须在某个时刻刷新。这必须发生在 ExceptionSubscriber 被触发之前。因此,使用它与 fingers_crossed 文件和/或电子邮件记录是最佳方法。其他处理程序尚未与 Catchable 的缓冲区服务一起测试。使用时请自行承担风险。

monolog:
    handlers:
        # Filter logs to a level you'd like
        filter:
            type: filter
            level: debug
            handler: catchable
        # Then channel them into Catchable's buffer for use by the ExceptionSubscriber as described above
        catchable:
            type: service
            id: forci.catchable.monolog.handler.log_buffer

版本 <= ~0.5

在您的 config.yml 中

forci_catchable:
    entity_manager: default

entity_manager 是您的 SEPARATE 实体管理器。

在您的 config_prod.yml 中

monolog:
    handlers:
        limitless:
            type: service
            id: forci.catchable.handler.limitless_buffer

此处理程序将收集所有日志并将其存储在数组中,这些数组将可用于 Catchable 的订阅者,并将其保存到数据库中的异常条目。

这也使得您可以使用记录器并记录可能对灾难恢复重要的重要数据。

然后,在您的应用程序中的某个位置创建一个链接到

<a href="{{ path('forci_catchable_root') }}">
    Errors
</a>

享受吧!

发布 0.6

  • 改进了缓冲区处理程序。现在您可以在主处理链中配置它。
  • 移除了弃用信息。允许与 Symfony 5 兼容。
  • 现在使用来自 Symfony 的 ErrorHandler 组件的 FlattenException,而不是 Debug
  • 移除了关于通过弃用的 FatalThrowableError 类序列化 \Throwable 的技巧。

从 0.5 升级到 0.6

  • Symfony 的要求现在是 ~4.4|~5.0
  • 已删除 Forci\Bundle\Catchable\Serializer\ExceptionSerializer 服务。所有相关代码现在都在 Forci\Bundle\Catchable\Collector\ThrowableCollector 中。
  • 已删除 forci.catchable.handler.limitless_buffer 服务,取而代之的是更简单的 forci.catchable.monolog.handler.log_buffer
  • 您的缓冲和/或过滤逻辑现在必须由任何内置的 Monolog 处理器处理。这使得缓冲相关日志更加流畅,并与您的其他处理器保持一致。

--

待办事项

  • 使忽略异常类成为可能
  • 添加一个“隐藏用户已弃用”复选框,用于隐藏以“User Deprecated”开头的日志消息
  • 添加文件和消息哈希,由于这些是文本且没有索引,因此通过哈希进行搜索以提高性能(归咎于 Doctrine 不允许指定索引长度)
  • 重命名为 ExceptionBundle、ExceptionCollector、ExceptionSerializer 等
  • 添加过滤异常配置
  • 对错误类型、文件、行、消息、当前日期/小时进行哈希处理,并在可捕获实体中增加“发生次数”计数器