https://github.com/xuesongtao/ps-log
1. 支持定时/实时去解析多个 log 文件 2.支持多个匹配规则, 匹配的内容支持不同的处理方式(支持同步/异步处理) 3.采用文件池将频繁使用的句柄进行缓存, 采用tire树缓存匹配规则
https://github.com/xuesongtao/ps-log
collect parse-log real-time-collect tail tail-logs
Last synced: 5 months ago
JSON representation
1. 支持定时/实时去解析多个 log 文件 2.支持多个匹配规则, 匹配的内容支持不同的处理方式(支持同步/异步处理) 3.采用文件池将频繁使用的句柄进行缓存, 采用tire树缓存匹配规则
- Host: GitHub
- URL: https://github.com/xuesongtao/ps-log
- Owner: xuesongtao
- License: mit
- Created: 2023-01-10T12:52:23.000Z (over 3 years ago)
- Default Branch: master
- Last Pushed: 2024-12-26T07:35:10.000Z (over 1 year ago)
- Last Synced: 2024-12-26T08:26:11.837Z (over 1 year ago)
- Topics: collect, parse-log, real-time-collect, tail, tail-logs
- Language: Go
- Homepage:
- Size: 327 KB
- Stars: 7
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# ps-log 日志分析
#### 项目背景
1. 开发/测试/生产环境(**微服务数量在 40+ 情况下**), 出现了 error log等不能被开发感知, 当反馈到开发时时间间隔较长, 如何解决?
> **解决**: 定时(如:10m)去解析 log 中每行包含 error 的内容, 再进行对应的处理(如: 发钉钉, 发邮件, 发es等)
2. 定时去分析 log 吗, 需要实时感知 error log 怎么办呢?
> **解决**: 通过文件事件通知来感知文件变化呀, 有变化的时候就去查看文件内容呀
3. 实时感知的文件需要起多个监听任务吗? 需要多次打开相同的文件怎么处理呢?
> **解决**: 不需要,只需要1个监听者,1个处理者; 可以通过池化文件句柄
#### 介绍
```go
go get -u gitee.com/xuesongtao/ps-log
```
1. 支持 **定时/实时** 去解析多个 log 文件; 采集完后会根据配置进行采集位置的持久化保存(即: 文件偏移量保存), 便于停机后重启防止出现重复采集现象(注: Change 设置的比较大时, 需要注意处理重启服务时, 偏移量未保存出现的重复数据)
2. 支持 log `行内容` 多个匹配规则; 支持解析**错误堆栈**(即: 支持行内容合并); 匹配的内容支持不同的处理方式(支持同步/异步处理)
3. 采用文件池将频繁使用的句柄进行缓存; 采用 `trie` 树缓存匹配规则提高匹配效率

#### 使用
##### 实时监听
```go
func main() {
ps, err := pslog.NewPsLog(pslog.WithAsync2Tos())
if err != nil {
panic(err)
}
defer ps.Close()
// 实时监听
if err := ps.TailLogs(); err != nil {
panic(err)
}
tmp := "log/test.log"
handler := &pslog.Handler{
CleanOffset: true, // 重新加载时, 清理已保存的 文件偏移量
Change: -1, // 每次都保存文件偏移量
Tail: true, // 实时监听
ExpireAt: pslog.NoExpire, // 不过期
Targets: []*pslog.Target{
{
Content: " ", // 目标内容
Excludes: []string{}, // 排查内容
To: []pslog.PsLogWriter{&pslog.Stdout{}},
},
},
}
// 注册
if err := ps.Register(handler); err != nil {
panic(err)
}
closeCh := make(chan int)
go func() {
fh := xfile.NewFileHandle(tmp)
if err := fh.Initf(os.O_RDWR | os.O_APPEND | os.O_TRUNC); err != nil {
log.Println(err)
return
}
defer fh.Close()
for i := 0; i < 10; i++ {
time.Sleep(10 * time.Millisecond)
_, err := fh.AppendContent(time.Now().Format(base.DatetimeFmt+".000") + " " + fmt.Sprint(i) + "\n")
if err != nil {
log.Println("write err:", err)
}
}
close(closeCh)
}()
// 添加待监听的 path
if err := ps.AddPaths(tmp); err != nil {
panic(err)
}
// dump
log.Println(ps.List())
for range closeCh {
}
}
```
#### 其他
- 采集服务示例: [gitee](https://gitee.com/xuesongtao/collect-log.git)
- 欢迎大佬们指正, 希望大佬给❤️,to [gitee](https://gitee.com/xuesongtao/ps-log.git), [github](https://github.com/xuesongtao/ps-log.git)