swayok / laravel-extended-errors

Laravel 日志扩展器,用于将日志和异常以 HTML 格式渲染,存储到文件或通过电子邮件和 Telegram 发送

7.0.1 2023-09-01 12:01 UTC

README

此软件包为 Laravel 日志系统提供额外的驱动程序(Telegram 和电子邮件)和日志渲染器。渲染器生成 HTML 代码,写入日志文件或发送到外部服务(Slack、电子邮件、Telegram)。

日志示例: screenshot_log.png

异常日志示例: screenshot_exception.png

1. 安装

Laravel <= 5.5

将 require 添加到 composer.json 并运行 composer update

"require": {
    "swayok/laravel-extended-errors": "5.5.*",
}

在分支 laravel_up_to_5.5 中使用第 2 步

Laravel 5.6+ 到 Laravel 9

将 require 添加到 composer.json 并运行 composer update

"require": {
    "swayok/laravel-extended-errors": ":6.0",
}

Laravel 10+

将 require 添加到 composer.json 并运行 composer update

"require": {
    "swayok/laravel-extended-errors": ":7.0",
}

配置

服务提供者

自动通过包自动发现添加。

渲染器

HTML 渲染器注入到 dailysingle 通道驱动程序

'single' => [
    'driver' => 'single',
    'path' => storage_path('logs/laravel.html'),
    'tap' => [\LaravelExtendedErrors\Formatter\HtmlFormatter::class],
    'level' => 'debug',
],

'daily' => [
    'driver' => 'daily',
    'path' => storage_path('logs/laravel.html'),
    'level' => 'debug',
    'days' => 7,
    'tap' => [\LaravelExtendedErrors\Formatter\HtmlFormatter::class],
], 

驱动程序

所有更改将应用于 config/logging.php 中的 'channels' 数组。

Telegram 通道

'telegram' => [
    'driver' => 'telegram',
    'token' => env('LOG_TELEGRAM_API_KEY'),
    'chat_id' => env('LOG_TELEGRAM_CHAT_ID'),
    'proxy' => [
        'type' => env('LOG_TELEGRAM_PROXY_TYPE', 'http'),
        'host' => env('LOG_TELEGRAM_PROXY_HOST'),
        'port' => env('LOG_TELEGRAM_PROXY_PORT'),
        'user' => env('LOG_TELEGRAM_PROXY_USER'),
        'password' => env('LOG_TELEGRAM_PROXY_PASSWORD'),
    ],
    'level' => 'debug',
    'bubble' => false',
]

渲染的日志和异常作为文档发送到提供的 chat_id

代理设置

  • proxy.type 可以是: httpsocks4socks5nginx
  • proxy.userproxy.password 可以留空,如果代理没有授权
  • proxy.host 对于 httpsocks4socks5 类型通常是 IP 地址,如 192.168.1.1
  • proxy.host 对于 nginx 类型应该是完整的 URL,如 http://bot.yourdomain.comhttps://bot.yourdomain.comhttp://bot.yourdomain.com:8080proxy.port 对于此类型不使用;

代理使用基本认证方法发送用户名和密码。目前不支持其他认证方法。如果有需要,请创建一个问题(确保 CURL 支持)。

Nginx vhost 配置以代理请求到 api.telegram.org

server {
    listen 80;
    server_name bot.yourdomain.com;
    location / {
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass https://api.telegram.org/;
        client_max_body_size 100M;
    }
}

电子邮件通道(可能不会与 Laravel 10+ 一起工作)

'email' => [
    'driver' => 'email',
    'level' => 'debug',
    'subject' => 'Server log',
    'sender' => 'local@test.lh',
    'receiver' => ['your@email.com'],
    'bubble' => false',
],

警告:没有对异常的限制,如果在高负载项目中使用此通道,最终可能会一次性获得数千个错误。

Sentry

实际上没有 Sentry 的通道驱动程序,但这里有一个快速教程,介绍如何通过 Handler.php 将异常报告添加到 Sentry。

要求 Sentry 包

"require": {
    "sentry/sentry": "^1.8",
    "sentry/sentry-laravel": "^0.8.0",
}

在您的 app/Exception/Handler.php 中更新 report() 方法,如下所示

public function report(Exception $exception) {
    if ($this->shouldReport($exception) && app()->bound('sentry')) {
        app('sentry')->captureException($exception, ['extra' => \LaravelExtendedErrors\Utils::getMoreInformationAboutRequest()]);
    }

    parent::report($exception);
}

将 Sentry 创建新项目时提供的 URL 添加到 .env 文件。它看起来像这样

SENTRY_DSN=https://8158bc7a6110...e7b152b@sentry.domain.com/1

请注意,使用 'extra' 键将报告发送到 Sentry。此键存储当前请求的所有数据,就像由 HTML 渲染器生成的异常日志一样。这提供了对发生事件的更好理解。

Whoops 异常页面替换

要使用此软件包渲染的异常页面替换 Laravel 内置的 Whoops 处理器渲染的 HTML 异常页面,您需要将 'replace_whoops' => true, 添加到 config/logging.php

自定义用户信息收集器

ExceptionHtmlRenderer 打印最小集用户信息:主键和类。要打印更多信息,您可以使用 ExceptionHtmlRenderer::setUserInfoCollector(\Closure) 提供您自己的用户信息收集器。闭包
不接受任何参数,必须返回null(未认证)或数组。此外,获取用户对象的方式取决于您。默认情况下,ExceptionHtmlRenderer 使用 request()->user();