column('id', 'ID')->sortable();
// 关联服务
$grid->column('service.name', '服务名称')->sortable();
$grid->column('service.code', '服务代码');
$grid->column('request_id', '请求ID')->copyable();
// HTTP方法
$grid->column('method', '方法')->display(function ($method) {
$colors = [
'GET' => 'success',
'POST' => 'primary',
'PUT' => 'warning',
'DELETE' => 'danger',
'PATCH' => 'info',
];
$color = $colors[$method] ?? 'secondary';
return "{$method}";
});
// URL(截断显示)
$grid->column('url', 'URL')->display(function ($url) {
$shortUrl = strlen($url) > 50 ? substr($url, 0, 50) . '...' : $url;
return "{$shortUrl}";
});
// 响应状态码
$grid->column('response_status', '状态码')->display(function ($status) {
if (!$status) {
return '-';
}
$color = 'secondary';
if ($status >= 200 && $status < 300) {
$color = 'success';
} elseif ($status >= 300 && $status < 400) {
$color = 'info';
} elseif ($status >= 400 && $status < 500) {
$color = 'warning';
} elseif ($status >= 500) {
$color = 'danger';
}
return "{$status}";
});
// 响应时间
$grid->column('response_time', '响应时间')->display(function ($time) {
if (!$time) {
return '-';
}
$color = 'success';
if ($time > 5000) {
$color = 'danger';
} elseif ($time > 2000) {
$color = 'warning';
} elseif ($time > 1000) {
$color = 'info';
}
return "{$time}ms";
})->sortable();
// 日志级别
$grid->column('level', '级别')->display(function ($level) {
$logLevel = LOG_LEVEL::tryFrom($level);
if ($logLevel) {
$color = $logLevel->getColor();
$icon = $logLevel->getIcon();
$label = $logLevel->getLabel();
return " {$label}";
}
return $level;
});
// 错误信息(截断显示)
$grid->column('error_message', '错误信息')->display(function ($error) {
if (!$error) {
return '-';
}
$shortError = strlen($error) > 30 ? substr($error, 0, 30) . '...' : $error;
return "{$shortError}";
});
// 用户信息
$grid->column('user_id', '用户ID');
$grid->column('ip_address', 'IP地址');
// 创建时间
$grid->column('created_at', '调用时间')->sortable();
// 过滤器
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('service_id', '服务')->select(
ThirdPartyService::pluck('name', 'id')->toArray()
);
$filter->equal('method', 'HTTP方法')->select([
'GET' => 'GET',
'POST' => 'POST',
'PUT' => 'PUT',
'DELETE' => 'DELETE',
'PATCH' => 'PATCH',
]);
$filter->equal('level', '日志级别')->select(LOG_LEVEL::getOptions());
$filter->between('response_status', '状态码');
$filter->between('response_time', '响应时间(ms)');
$filter->like('request_id', '请求ID');
$filter->like('url', 'URL');
$filter->like('error_message', '错误信息');
$filter->equal('user_id', '用户ID');
$filter->like('ip_address', 'IP地址');
$filter->between('created_at', '调用时间')->datetime();
});
// 批量操作
$grid->batchActions(function (Grid\Tools\BatchActions $batch) {
// TODO: 创建批量操作类
// $batch->add('批量删除', new \App\Module\ThirdParty\AdminActions\BatchDeleteLogAction());
});
// 工具栏
$grid->tools(function (Grid\Tools $tools) {
$tools->append(' 统计分析');
$tools->append(' 导出日志');
$tools->append(' 清理日志');
});
// 行操作
$grid->actions(function (Grid\Displayers\Actions $actions) {
// 移除编辑按钮,日志只读
$actions->disableEdit();
if ($actions->row->error_message) {
$actions->append(' 重试');
}
});
// 默认排序(最新的在前)
$grid->model()->orderBy('created_at', 'desc');
// 禁用创建按钮
$grid->disableCreateButton();
});
}
/**
* 详情页面
*
* @return Show
*/
protected function detail($id): Show
{
return Show::make($id, new ThirdPartyLogRepository(), function (Show $show) {
$show->field('id', 'ID');
$show->field('service.name', '服务名称');
$show->field('service.code', '服务代码');
$show->field('credential.name', '使用凭证');
$show->field('request_id', '请求ID');
$show->field('method', 'HTTP方法');
$show->field('url', '请求URL');
$show->field('headers', '请求头')->json();
$show->field('params', '请求参数')->json();
$show->field('body', '请求体')->code();
$show->field('response_status', '响应状态码');
$show->field('response_headers', '响应头')->json();
$show->field('response_body', '响应体')->code();
$show->field('response_time', '响应时间')->as(function ($time) {
return $time ? $time . ' ms' : '-';
});
$show->field('level', '日志级别')->as(function ($level) {
$logLevel = LOG_LEVEL::tryFrom($level);
return $logLevel ? $logLevel->getLabel() : $level;
});
$show->field('error_message', '错误信息');
$show->field('user_id', '用户ID');
$show->field('ip_address', 'IP地址');
$show->field('user_agent', 'User Agent');
$show->field('created_at', '调用时间');
// 相关日志
$show->relation('relatedLogs', '相关日志', function ($model) {
$grid = new Grid(new ThirdPartyLog());
$grid->model()->where('service_id', $model->service_id)
->where('id', '!=', $model->id)
->orderBy('created_at', 'desc')
->limit(10);
$grid->column('request_id', '请求ID');
$grid->column('method', '方法');
$grid->column('response_status', '状态码');
$grid->column('response_time', '响应时间(ms)');
$grid->column('level', '级别');
$grid->column('created_at', '时间');
$grid->disableCreateButton();
$grid->disableActions();
$grid->disableFilter();
$grid->disableBatchActions();
return $grid;
});
});
}
}