查询日志
查询日志模块记录所有经过 DNS-Go 的 DNS 查询请求,提供详细的查询分析和审计功能。
功能概述
查询日志模块提供:
- 完整查询记录:记录所有 DNS 查询的详细信息
- 实时日志推送:通过 WebSocket/SSE 实时查看查询日志
- 多维度筛选:按时间、域名、IP、类型等筛选
- 统计分析:查询量统计、热门域名排行
- 日志导出:支持导出日志数据
记录内容
每条查询日志包含以下信息:
| 字段 | 说明 | 示例 |
|---|---|---|
| 查询时间 | 查询发生的精确时间 | 2025-01-15 10:30:25 |
| 客户端 IP | 发起查询的客户端地址 | 192.168.1.100 |
| 查询域名 | 被查询的域名 | www.example.com |
| 查询类型 | DNS 查询类型 | A、AAAA、MX |
| 响应结果 | 返回的记录值 | 192.168.1.50 |
| 响应时间 | 查询处理耗时 | 25ms |
| 查询来源 | 本地/上游/缓存 | cache |
| 上游服务器 | 使用的上游 DNS | 223.5.5.5 |
| 命中缓存 | 是否命中缓存 | 是 |
日志查询
Web 界面查询
- 进入「日志分析」→「查询日志」
- 使用筛选条件缩小查询范围:
筛选条件:
| 条件 | 说明 | 示例 |
|---|---|---|
| 时间范围 | 查询发生的时间段 | 最近 1 小时、今天、自定义 |
| 客户端 IP | 查询来源 IP | 192.168.1.100 |
| 域名 | 被查询的域名 | www.example.com |
| 查询类型 | A、AAAA、MX 等 | A |
| 响应来源 | 本地/上游/缓存 | cache |
| 状态 | 成功/失败 | 成功 |
- 点击「查询」按钮查看结果
高级搜索
支持模糊搜索和组合条件:
- 域名模糊搜索:输入
example可匹配所有包含该字符串的域名 - IP 段搜索:输入
192.168.1.可匹配该网段的所有 IP - 多条件组合:同时使用时间和域名筛选
实时日志
WebSocket 实时推送
DNS-Go 通过 WebSocket 实时推送查询日志到前端界面。
连接方式:
javascript
const ws = new WebSocket('ws://localhost:8085/api/logs/stream');
ws.onmessage = (event) => {
const log = JSON.parse(event.data);
console.log('新查询日志:', log);
};日志数据格式:
json
{
"timestamp": "2025-01-15T10:30:25.123Z",
"client_ip": "192.168.1.100",
"domain": "www.example.com",
"query_type": "A",
"response": "192.168.1.50",
"response_time": 25,
"source": "cache",
"upstream": "",
"cache_hit": true
}SSE 实时推送
作为 WebSocket 的替代方案,也支持 SSE(Server-Sent Events):
javascript
const eventSource = new EventSource('http://localhost:8085/api/logs/sse');
eventSource.onmessage = (event) => {
const log = JSON.parse(event.data);
console.log('新查询日志:', log);
};实时日志界面
Web 界面提供实时日志查看功能:
- 自动刷新:新日志自动追加到列表顶部
- 滚动锁定:可暂停自动滚动查看历史
- 高亮显示:不同类型查询使用不同颜色标识
统计分析
查询量统计
查看指定时间段内的查询量趋势:
- 按小时统计(24 小时视图)
- 按天统计(7 天/30 天视图)
- 按查询类型统计
热门域名排行
查看被查询次数最多的域名:
| 排名 | 域名 | 查询次数 | 占比 |
|---|---|---|---|
| 1 | www.google.com | 15,234 | 25% |
| 2 | www.baidu.com | 12,567 | 20% |
| 3 | api.example.com | 8,901 | 15% |
客户端排行
查看查询量最大的客户端:
| 排名 | 客户端 IP | 查询次数 | 占比 |
|---|---|---|---|
| 1 | 192.168.1.100 | 25,678 | 35% |
| 2 | 192.168.1.101 | 18,234 | 25% |
| 3 | 192.168.1.102 | 12,456 | 17% |
日志导出
导出格式
支持多种导出格式:
- CSV:逗号分隔值,适合 Excel 分析
- JSON:结构化数据,适合程序处理
- TXT:纯文本格式,方便查看
导出方式
界面导出:
- 在查询结果页面点击「导出」按钮
- 选择导出格式和范围
- 下载导出的文件
API 导出:
bashGET /api/logs/export?format=csv&start=2025-01-01&end=2025-01-15
导出限制
- 单次导出最大条数:100,000 条
- 导出时间范围:最长 30 天
- 大容量导出建议分批进行
日志清理
自动清理
可配置自动清理策略,防止日志数据无限增长:
清理策略:
| 策略 | 说明 | 建议 |
|---|---|---|
| 保留天数 | 保留最近 N 天的日志 | 7-30 天 |
| 最大条数 | 保留最近 N 条日志 | 100 万条 |
| 定时清理 | 每天/每周定时清理 | 每天凌晨 |
配置方式:
- 进入「系统管理」→「日志配置」
- 设置清理策略
- 保存配置
手动清理
手动删除指定时间范围的日志:
- 进入「日志分析」→「查询日志」
- 选择「日志清理」功能
- 选择要清理的时间范围
- 确认清理操作
⚠️ 警告:清理操作不可恢复,请谨慎操作!
API 接口
查询日志列表
bash
GET /api/logs/list?page=1&pageSize=50&start_time=2025-01-01&end_time=2025-01-15请求参数:
| 参数 | 类型 | 说明 |
|---|---|---|
| page | int | 页码 |
| pageSize | int | 每页数量 |
| start_time | string | 开始时间 |
| end_time | string | 结束时间 |
| client_ip | string | 客户端 IP(可选) |
| domain | string | 域名(可选) |
| query_type | string | 查询类型(可选) |
响应示例:
json
{
"code": 200,
"data": {
"list": [
{
"id": 1,
"timestamp": "2025-01-15T10:30:25Z",
"client_ip": "192.168.1.100",
"domain": "www.example.com",
"query_type": "A",
"response": "192.168.1.50",
"response_time": 25,
"source": "cache",
"upstream": "",
"cache_hit": true
}
],
"total": 15000
}
}获取统计信息
bash
GET /api/logs/stats?start=2025-01-01&end=2025-01-15响应示例:
json
{
"code": 200,
"data": {
"total_queries": 150000,
"cache_hit_rate": 65.5,
"avg_response_time": 12.5,
"top_domains": [
{"domain": "www.google.com", "count": 15234},
{"domain": "www.baidu.com", "count": 12567}
],
"top_clients": [
{"ip": "192.168.1.100", "count": 25678},
{"ip": "192.168.1.101", "count": 18234}
]
}
}WebSocket 实时日志
javascript
// 连接实时日志 WebSocket
const ws = new WebSocket('ws://localhost:8085/api/logs/stream');
ws.onopen = () => {
console.log('WebSocket 连接成功');
};
ws.onmessage = (event) => {
const log = JSON.parse(event.data);
// 处理日志数据
};
ws.onclose = () => {
console.log('WebSocket 连接关闭');
};导出日志
bash
GET /api/logs/export?format=csv&start=2025-01-01&end=2025-01-15&domain=example.com最佳实践
日志保留策略
根据存储资源和业务需求制定保留策略:
| 场景 | 保留时间 | 说明 |
|---|---|---|
| 生产环境 | 7-30 天 | 平衡存储和审计需求 |
| 开发测试 | 1-3 天 | 节省存储空间 |
| 安全审计 | 90 天以上 | 满足合规要求 |
性能优化
减少日志写入压力:
- 设置合理的日志采样率(如每 100 条记录 1 条)
- 关闭非必要的字段记录
- 使用异步日志写入
查询性能优化:
- 为常用查询条件建立索引
- 定期归档历史日志
- 大数据量查询使用分页
安全考虑
敏感信息处理:
- 避免记录敏感域名的查询日志
- 内网域名查询可适当减少记录
- 定期审计日志访问权限
故障排查
日志不记录
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 日志功能未启用 | 配置中关闭了日志 | 在系统设置中启用 |
| 存储空间不足 | 磁盘已满 | 清理日志或扩容磁盘 |
| 数据库连接失败 | 数据库异常 | 检查数据库状态 |
查询速度慢
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 数据量过大 | 未清理历史日志 | 执行日志清理 |
| 缺少索引 | 查询条件未索引 | 添加索引 |
| 时间范围太大 | 查询范围过宽 | 缩小查询范围 |
实时日志不更新
| 问题 | 原因 | 解决方案 |
|---|---|---|
| WebSocket 断开 | 网络问题 | 重新连接 |
| 浏览器兼容 | 不支持 WebSocket | 更换浏览器 |
| 服务异常 | 后端服务故障 | 检查服务状态 |