czernika/orchid-log-viewer

在Orchid管理面板中管理您的Laravel应用日志

1.0.10 2024-08-21 13:24 UTC

This package is auto-updated.

Last update: 2024-09-21 13:37:42 UTC


README

Run tests

日志表布局采用Orchid风格,允许您在管理面板中查看和管理Laravel应用程序存储日志

Orchid log table

支持

1.x版本需要PHP 8.1以上,Orchid版本14或更高,Laravel版本10+

此包基于rap2hpoutre/laravel-log-viewer

安装

通过composer安装包

composer require czernika/orchid-log-viewer

就这样。包为您注册了菜单项和屏幕。现在您需要做的就是访问logs页面(它应该在Orchid前缀下可用,最有可能的是/admin/logs

发布配置

如果您需要发布配置和本地化文件,请运行以下命令

php artisan vendor:publish --provider="Czernika\OrchidLogViewer\OrchidLogServiceProvider"

配置文件包含注释,这些注释可以帮助您更好地理解此包

配置

此包开箱即用。然而,您可以根据需要更改任何选项

更改默认屏幕

如果您需要更改屏幕上的某些数据,但没有配置选项,您仍然可以完全覆盖屏幕本身

创建一个新的自定义屏幕类,并从OrchidLogListScreen类扩展它

use Czernika\OrchidLogViewer\Screen\OrchidLogListScreen;

class CustomLogListScreen extends OrchidLogListScreen
{
    // Change logic
}

AppServiceProvider中注册它。这样,包就会知道使用自定义屏幕而不是默认屏幕

use Czernika\OrchidLogViewer\LogManager;

public function boot()
{
    LogManager::useScreen(CustomLogListScreen::class);
}

默认布局由三部分组成 - 过滤器、堆栈跟踪的模态框和表格。这对于自定义屏幕来说应该是一样的。表格针对logs目标 - 确保它在query()方法中返回,或者更改布局

更改默认布局

如果您需要扩展列或添加新列,这也是可能的

使用相同的技巧 - 创建一个新类,并从OrchidLogTableLayout类扩展它

use Czernika\OrchidLogViewer\Layouts\OrchidLogTableLayout;

class CustomLogTableLayout extends OrchidLogTableLayout
{
    // Change logic
}

AppServiceProvider中注册它

use Czernika\OrchidLogViewer\LogManager;

public function boot()
{
    LogManager::useLayout(CustomLogTableLayout::class);
}

添加自定义列。您可以使用以下默认列中的某些列

public function columns(): iterable
{
    return [
        $this->levelColumn(), // Level icon with level name
        $this->textColumn(), // Log message text (70% table wide)
        $this->stackTraceColumn(), // Stack trace modal button
        $this->dateColumn(), // Date column
    ];
}

更改日志数据对象

所有日志都作为Czernika\OrchidLogViewer\LogData类返回。它可以从rap2hpoutre/laravel-log-viewer包访问所有属性,但以对象方式

基本日志表示一个包含以下数据的数组

[
    'text' => '',
    'context' => '',
    'level' => '',
    'level_class' => '',
    'level_img' => '',
    'folder' => '',
    'in_file' => '',
    'date' => '',
]

此包将其转换为具有数据数组作为唯一参数的LogData类,以便以方便的方式(通过具有相同名称但为camelCase的方法)访问所有内容...

$log->text();
$log->levelClass();

// etc

...同时可以访问Orchid列快捷方式

TD::make('text', 'Text'),

// instead of

TD::make('text', 'Text')
    ->render(fn (array $log) => $log['text']),

但是,如果您愿意,也可以更改映射器类,并完全覆盖其逻辑

创建一个新的类

请记住 - 它只接受日志数据的数组!

use Czernika\OrchidLogViewer\LogData;

class CustomLogData extends LogData
{
    public function areWeGood(): bool
    {
        return 'error' === $this->data['level'] ? 'Nope' : 'Sure we are';
    }
}

注册它

use Czernika\OrchidLogViewer\LogManager;

public function boot()
{
    LogManager::useMapper(CustomLogData::class);
}

现在您可以渲染自定义布局

TD::make('are_we_good')
    ->render(fn (LogData $log) => $log->areWeGood()),

如果您希望保持Orchid快捷方式名称的数组数据作为$data变量,并在自定义类中使用Contentable特性,您可以这样做

use Czernika\OrchidLogViewer\Support\Traits\Contentable;

class CustomLogData
{
    use Contentable;

    public function __construct(
        protected readonly array $data,
    ) {}

    public function areWeGood(): bool
    {
        return 'error' === $this->data['level'] ? 'Nope' : 'Sure we are';
    }
}

并创建没有渲染函数的列

TD::make('areWeGood'), // pass name in a exact case as method in a custom class (not `are_we_good`)

当然,如果您需要自定义列,您还需要更改表格布局

更改操作(清除和删除)

清除和删除操作基本上会清除和删除文件,显示通知,并返回到指定的路由。如果您需要执行额外的工作,您可以通过注册自己的操作来更改这些操作的行为

为此没有注册事件 - 您仍然可以通过自定义操作完全控制此过程

use Czernika\OrchidLogViewer\LogManager;

public function boot()
{
    LogManager::clearLogFileUsing(CustomClearLogFileAction::class);
    LogManager::deleteLogFileUsing(CustomDeleteLogFileAction::class);
}

每个操作都应该继承 Czernika\OrchidLogViewer\Contracts\HandlesLogs 接口并实现 handle 方法。

use Czernika\OrchidLogViewer\Contracts\HandlesLogs;
use Czernika\OrchidLogViewer\Contracts\LogServiceContract;

public function handle(LogServiceContract $logService, string $file): void
{
    // ...
}

$logService 具有清除或删除文件的方法(如 clearFile($file)deleteFile($file))。变量 $file 包含日志文件的 basename(不是完整路径,例如 'laravel.log' 而不是 '/var/www/html/storage/logs/laravel.log')。

注意 - 在操作中不需要重定向 - 它不应该返回任何响应。包自己处理重定向以防止与选定的文件相关的错误。

其他选项

在配置文件中,您可以完全禁用过滤器 - 当您使用 stack 日志通道并且只有一个文件时,这可能很有用。

您还可以完全禁用菜单项和路由的注册,但您必须自己重新注册它们。

已知问题

  • 仅与 "laravelish" 日志一起工作 - 如果您使用例如由进程管理器(如 supervisor 或 pm2)创建的 worker.log,则无法正确识别。
  • 调用堆栈跟踪模态时可能会发生 414 错误。

路线图

  • - 添加选项以排除“不可读”的日志文件。
  • - 添加更多权限以查看菜单项和操作按钮。
  • - 考虑:可能值得注册 platform.logs 权限,这将需要才能访问屏幕?

测试

使用 Pest 作为测试工具。

composer test

待办事项

  • - 对自定义屏幕/布局进行功能测试。
  • - 对自定义对象进行单元测试。
  • - 对过滤器进行测试。

许可证

开源许可下 MIT