在本项目立项之时,我的目标就是做一个单机日志解决方案,不仅要有日志存储、查询功能,还要能记录 PageView、Metrics。前面介绍的内容只是说明了日志存储、查询是如何运作的,并还未达到最终的目标,而 V.Talog.Server 就是基于 Talog 开发的最终项目成品。
V.Talog.Server
V.Talog.Server 的目标是希望做成一个接口平台,通过调用接口来保存日志、记录 PageView、记录 Metrics,同时还能集成一个后台管理页面,以供查询数据。
目前 V.Talog.Server 具有以下几个功能:
- 监听本地日志文件,该功能适用于将 Talog 与其他服务部署在同一台机器的情况
- 日志索引、日志查询
- 记录、查看 PageView
- 记录、查看 Metrics
监听本地日志文件
考虑到用户可能已经有一些服务日志存储在本地文件中,因此 V.Talog.Server 添加了一个监听本地日志文件的功能。要启用该功能,只需要在 appsettings.json 文件中添加以下配置。
"Logs": [
{
"Path": "/var/log/nginx",
"Filter": "access.log",
"Index": "nginx",
"Tags": {
"type": "access"
},
"Type": 1
},
{
"Path": "/var/log/nginx",
"Filter": "error.log",
"Index": "nginx",
"Tags": {
"type": "error"
},
"Type": 1
}
]
Path 代表需要监听的目录;Filter 用于筛选出想要监听的文件,本质上为正则表达式,例如以上配置只监听了 access.log、error.log 两个文件,如果想要监听所有文件可以配置 .*
;Tags 用于配置日志所对应的标签;Type 用于标识日志为单行或者多行,0 代表单行日志,1 代表多行日志;还有个 Head 字段,该字段用于指定多行日志的自定义头。
对于新加入监听列表的文件,V.Talog.Server 会将整个文件的日志都进行一次索引,并且记录下文件的末尾位置。当文件有发生变化时,V.Talog.Server 会从之前记录的位置继续读取日志,而不会从头开始读取,就算程序中断了也是如此,因为 V.Talog.Server 会将每个文件的已读位置记录在文件中。
日志索引、日志查询
V.Talog.Server 作为一个日志解决方案,提供了 API 接口以供其他程序上传日志,也提供了一个后台管理页面,以供用户在遇到问题时,可以快速查看日志。
POST /log/index
日志索引接口
Request:
{
"index": "",
"tags": {
"key1": "value1",
"key2": "value2"
},
"data": [
"log1",
"log2"
],
"type": 1, // 0 单行日志(json 日志也属于单行日志) 1 多行日志
"head": "" // 多行日志需要设置一个自定义头,若该参数为空,则以 Index 替代
}
POST /log/search?page=1&perPage=10
日志查询接口,支持分页,page 从 1 开始
Request:
{
"index": "",
"tagQuery": "", // 标签查询表达式,语法参考 V.QueryParser
"regex": "", // 正则表达式,若该参数不为空,则认为日志为非 json 格式进行处理,只会返回与之匹配的日志
"fieldQuery": "", // 字段筛选,若 regex 不为空,则基于正则字段筛选,若 regex 为空,则认为日志为 json 格式,基于 json 字段筛选
"sort": "" // 排序规则,type asc then date desc then ...
}
Response:
{
"data": {
"total": 1, // 查询到的日志总数
"items": [ // 日志数组
{
"groups": { // 当请求参数中 regex 生效时,会返回 groups 字段,表示匹配到的正则字段
"date": "29/Nov/2022:09:14:07 +0800",
"method": "POST",
"path": "/talog/log/remove",
"schema": "HTTP/1.1",
"code": "200",
"length": "31",
"reference": "https://vbranch.cn/talog/index.html",
"agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
},
"tags": [{ // 每一条日志的标签数组
"label": "additionalProp1",
"value": "string"
}],
"data": { // data 字段大部分情况下会直接返回日志字符串,但是当 regex 为空,并且 FieldQuery 或 sort 字段不为空时,会认为日志为 json 格式,此时返回的 data 字段会是一个 json 对象
"key": "value"
}
}
]
},
"code": 0, // 0 正常,其他情况为不正常
"msg": null // 当 code 不为 0 时,msg 返回错误信息
}
后台页面查询日志
记录、查看 PageView
PageView 也是同样的,提供一个上传数据的 API 接口,以及一个后台查看页面。
GET /metric/pg/add?index=xxx&page=xxx&user=xxx
Page View 接口,index、page 都是必传参数,user 非必传,user 用于统计 UV
后台页面查看 PageView
记录、查看 Metrics
GET /metric/add?index=xxx&name=xxx&value=xxx
指标接口,name 为指标名称(如 cpu、memory),value 为指标值
后台页面查看 Metrics
最后
本文列举了 V.Talog.Server 的功能,功能较少但是对于我个人来说已经够用了,我一开始也提到过,我是在看到了其他项目功能特别简洁,才萌生自己做一个简易的日志解决方案。若是像 elasticsearch 那种功能强大的项目,我肯定是做不来分毫的。下一篇文章将会介绍一下 V.Talog.Server 的搭建过程。