czernika / orchid-log-viewer
在Orchid管理面板中管理您的Laravel应用日志
Requires
- php: ^8.1
- laravel/framework: ^10.0|^11.0
- orchid/platform: ^14.21
- rap2hpoutre/laravel-log-viewer: ^2.3
Requires (Dev)
- ergebnis/composer-normalize: ^2.41
- laravel/pint: ^1.13
- mockery/mockery: ^1.6
- orchestra/testbench: ^8.19
- pestphp/pest: ^2.30
README
日志表布局采用Orchid风格,允许您在管理面板中查看和管理Laravel应用程序存储日志
支持
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。