Files
ulthon_admin/app/admin/view/nginx/access_log/index.js
augushong 8faa52ce90 feat(nginx-log): 多节点适配(node_id 全链路 + 全局/按节点聚合 + 节点筛选 + v2.4.0 升级脚本)
- 6 张表加 node_id 字段 + position/stat 改复合唯一键(migration)
- 6 个 Scheme 同步 node_id 注解 + 唯一键
- Reader 带 node_id 参数 + 懒加载接管(getLastPosition 回退查 node_id='')
- Aggregator 全局行(node_id='')+ 按节点循环 insertAggregatesForScope
- Stat 所有查询方法加 where node_id 条件
- Dashboard 控制器/视图加节点筛选下拉框 + AJAX 带 node_id
- AccessLog 列表加节点列 + 采集进度卡片显示节点信息
- import 定时任务 run_type 改 all(每节点采集自己的日志)
- v2.4.0 升级脚本追加 ALTER TABLE(幂等 check-then-alter)
- 菜单调整:去掉 Nginx 顶级菜单 + 读取位置管理,改为系统管理下挂两个子菜单
- ulthon-timer 文档补充 run_type=all 多节点部署注意事项
2026-08-08 10:33:20 +08:00

50 lines
2.6 KiB
PHP

$(function(){
ua.table.render({
init: init,
toolbar: [],
defaultToolbar: ['filter'],
cols: [[
{type: 'checkbox'},
{field: 'time_local', title: '时间', width: 170, search: 'range', templet: ua.table.date},
{field: 'method', title: '方法', width: 80, search: 'select', selectList: {GET: 'GET', POST: 'POST', PUT: 'PUT', DELETE: 'DELETE', HEAD: 'HEAD', OPTIONS: 'OPTIONS', PATCH: 'PATCH'}},
{field: 'uri', title: 'URI', minWidth: 200, searchOp: '%*%'},
{field: 'status', title: '状态码', width: 90, search: 'select', selectList: {200: '200', 301: '301', 302: '302', 304: '304', 400: '400', 401: '401', 403: '403', 404: '404', 499: '499', 500: '500', 502: '502', 503: '503', 504: '504'}, templet: function(d) {
var s = parseInt(d.status);
var cls = 'layui-badge';
if (s >= 200 && s < 300) cls = 'layui-badge layui-bg-green';
else if (s >= 300 && s < 400) cls = 'layui-badge layui-bg-blue';
else if (s >= 400 && s < 500) cls = 'layui-badge layui-bg-orange';
else if (s >= 500) cls = 'layui-badge layui-bg-red';
return '<span class="' + cls + '">' + d.status + '</span>';
}},
{field: 'node_id', title: '节点', width: 120, searchOp: '='},
{field: 'remote_addr', title: '客户端IP', width: 140, searchOp: '%*%'},
{field: 'request_time', title: '耗时(秒)', width: 100, search: 'number_limit', templet: function(d) {
var t = parseFloat(d.request_time);
if (t >= 1) return '<span class="layui-badge layui-bg-red">' + t + 's</span>';
if (t >= 0.3) return '<span class="layui-badge layui-bg-orange">' + t + 's</span>';
return t + 's';
}},
{field: 'body_bytes_sent', title: '响应字节', width: 100, search: 'number_limit'},
{field: 'http_user_agent', title: 'User-Agent', minWidth: 200, search: false},
{
width: 100, title: '操作', templet: ua.table.tool, fixed: 'right', operat: [
[{
class: 'layui-btn layui-btn-primary layui-btn-xs',
method: 'tab',
field: 'id',
text: '详情',
title: '查看详情',
auth: 'read',
url: init.readUrl,
icon: ''
}]
]
},
]],
});
ua.listen();
})