实时分析日志

xuesongtao · 2023-01-11 15:28:37 · 7241 次点击    
这是一个分享于 2023-01-11 15:28:37 的资源,其中的信息可能已经有所发展或是发生改变。

ps-log 日志分析

项目背景

  1. 测试/开发环境, 出现了 error log等不能被开发感知, 当反馈到开发时时间间隔较长, 如何解决?

    解决: 定时(如:10m)去解析 log 中每行包含 error 的内容, 再进行对应的处理(如: 发邮件, 发es等)

  2. 定时去分析 log 吗, 需要实时感知 error log 怎么办呢?

    解决: 通过文件事件通知来感知文件变化呀, 有变化的时候就去查看文件内容

  3. 实时感知的文件需要起多个监听任务吗? 需要频繁打开相同的文件怎么处理呢?

    解决: 不需要,只需要1个监听者,1个处理者; 可以通过池化文件句柄

介绍

  1. 支持定时/实时去解析多个 log 文件, 采集完后会根据配置进行采集位置的持久化保存(即: 文件偏移量保存), 便于停机后重启防止出现重复采集现象
  2. 支持 log 行内容 多个匹配规则, 匹配的内容支持不同的处理方式(支持同步/异步处理)
  3. 采用文件池将频繁使用的句柄进行缓存, 采用 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)
 }

 handler := &pslog.Handler{
  CleanOffset: true,
  Change:   -1,
  Tail:     true,
  ExpireAt: pslog.NoExpire,
  Targets: []*pslog.Target{
   {
    Content:  " 9",
    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("log/test.log")
  if err := fh.Initf(os.O_RDWR | os.O_TRUNC); err != nil {
   xlog.Error(err)
   return
  }
  defer fh.Close()
  f := fh.GetFile()
  for i := 0; i < 30; i++ {
   time.Sleep(time.Second)
   _, err := f.WriteString(time.Now().Format(base.DatetimeFmt+".000") + " " + fmt.Sprint(i) + "\n")
   if err != nil {
    xlog.Error("write err:", err)
   }
  }
  close(closeCh)
 }()

 if err := ps.AddPaths("log/test.log"); err != nil {
  panic(err)
 }

 for range closeCh {}
}

其他

  • 欢迎大佬们指正, 希望大佬给❤️,to gitee, github

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

7241 次点击  ∙  2 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传