代码拉取完成,页面将自动刷新
解决: 定时(如:10m)去解析 log 中每行包含 error 的内容, 再进行对应的处理(如: 发钉钉, 发邮件, 发es等)
解决: 通过文件事件通知来感知文件变化呀, 有变化的时候就去查看文件内容呀
解决: 不需要,只需要1个监听者,1个处理者; 可以通过池化文件句柄
go get -u gitee.com/xuesongtao/ps-log
行内容
多个匹配规则; 支持解析错误堆栈(即: 支持行内容合并); 匹配的内容支持不同的处理方式(支持同步/异步处理)tire
树缓存匹配规则提高匹配效率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 {
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型