发现了一个 Go 最小化日志系统的好轮子

大家好,我是煎鱼。

在目前降本增效的大浪潮下,很多甲方给的服务器资源非常稀缺,又或是乙方做 OP 时,需要以更合理的应用资源去报价,以此取得一定的综合优势。

这种情况下,日志系统常常被削减甚至是去掉的一个组件。为此,一个极简方案就非常有必要了。最近在冲浪时,发现了个新起之秀。分享新轮子给大家。

Logdy 极简日志系统

基本使用

这个新开源库 logdyhq/logdy-core[1] 给自己打的标语是:“使用 Web 浏览器 UI 和低代码增强终端日志,节省 90% 的搜索和浏览日志的时间”。

看着就很省钱,一下子就引起了我的关注。

8f980a34e711cd314798bd64df793b8b.png

该库有两种基本用法,分别是:

1、独立使用:

# use with any shell command
$ tail -f file.log | logdy
INFO[2024-02...] WebUI started, visit http://localhost:8080    port=8080

2、基于 Go 库使用:

package main

import "github.com/logdyhq/logdy-core/logdy"

func main(){
  logdyLogger := logdy.InitializeLogdy(logdy.Config{
    ServerIp:       "127.0.0.1",
    ServerPort:     "8080",
  }, nil)
  logdyLogger.LogString("Log message")
  <-context.Background().Done()
}

启动后,浏览器访问:http://localhost:8080,可以看到日志系统界面如下:

fd06b2cd4f5c2d2df263da0fc2937fbd.png

从界面上看感觉是比较简单的。

字段配置

在真正的日志使用中,我们肯定有大量的字段,在日志里也需要进一步分析和查看。如果都是原始日志看起来是比较麻烦的。

以下是更进一步的 Go 程序上报日志的使用。代码如下:

package main

import (
 "fmt"
 "log"
 "net/http"
 "strings"
 "time"

 logdy "github.com/logdyhq/logdy-core/logdy"
)

type Logger struct {
 logdy   logdy.Logdy
 handler http.Handler
}

func (l *Logger) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 start := time.Now()

 l.handler.ServeHTTP(w, r)

 if strings.HasPrefix(r.URL.Path, l.logdy.Config().HttpPathPrefix) {
  return
 }

 l.logdy.Log(logdy.Fields{
  "ua":     r.Header.Get("user-agent"),
  "method": r.Method,
  "path":   r.URL.Path,
  "query":  r.URL.RawQuery,
  "time":   time.Since(start),
 })
}

func main() {
 mux := http.NewServeMux()

 mux.HandleFunc("/v1/hello", func(w http.ResponseWriter, r *http.Request) {
  w.Write([]byte("Hello, World!"))
 })

 mux.HandleFunc("/v1/time", func(w http.ResponseWriter, r *http.Request) {
  curTime := time.Now().Format(time.Kitchen)
  w.Write([]byte(fmt.Sprintf("the current time is %v", curTime)))
 })

 logger := logdy.InitializeLogdy(logdy.Config{
  HttpPathPrefix: "/_logdy-ui",
 }, mux)

 addr := ":8082"
 log.Printf("server is listening at %s", addr)
 log.Fatal(http.ListenAndServe(addr, &Logger{logdy: logger, handler: mux}))
}

运行起来后,我们请求 http://localhost:8082/v1/hello 进行按字段的类别的日志写入。

再到 http://localhost:8082/_logdy-ui/ 访问就可以看到已经写入的日志了。

为了更友好的查看日志,可以到 Settings - Columns 中设置 Auto-generated columns 自动生成字段格式:

a8983a603a690603a1264607ddc4f61e.png

设置后再查看,就会直观许多:

7ae1fef4f4a0c5f31e9514973ad61974.png

进阶使用

最偏向公司项目实战的基本门槛,我认为还得是 Kubernetes 多容器使用。

Logdy 也有所提供,监听单个 Docker 容器日志的命令:

$ docker logs my-container --follow --tail=10 | logdy

监听多个容器的日志并将其合并为一个流:

$ logdy socket 8123 8124
$ docker logs my-container1 --follow --tail=10 | logdy forward 8123
$ docker logs my-container2 --follow --tail=10 | logdy forward 8124

不过结合我的个人经验来看,现阶段如果直接应用 logdy 在生产的话,还是需要进行一些开发或调整的。

因为本质上我们不可能一个个配置容器给 logdy,因此我们需要修改 Kubernetes 容器启动的配置命名等。

当然,最好的情况下是 logdy 可以提供类似 promethues 的自动发现机制的案例。这样使用的便捷性大大提高,logdy 的业务推广度肯定也会起来。

另外如果使用 VSCode,可以直接搜:Simple Browser: Show。以此访问对应的 logdy UI 地址:

016be36ff8edec06ae9038d677acc7eb.png

这样一来就可以基于 VSCode 提供的功能实现在 IDE 中看日志了。

9e77f634f15b2d2a647b443c0e45a222.png

总结

今天给大家分享了一个极简日志系统的新轮子 logdy,这目前还在活跃开发阶段,如果大家有什么新的想法或需要加强的点,都可以及时尝试后提给社区开发者。

如果能够成型成熟的话,对于后面压缩日志系统到极简私有化的环境下,还是有一定的价值的。

推荐阅读

参考资料

[1]

logdyhq/logdy-core: https://github.com/logdyhq/logdy-core

关注和加煎鱼微信,

一手消息和知识,拉你进技术交流群👇

fc02d0a7b8a2f82b470a8133ab7ff0d6.jpeg

0aeb0198564b2ed3edaa582e80d13014.png

你好,我是煎鱼,出版过 Go 畅销书《Go 语言编程之旅》,再到获得 GOP(Go 领域最有观点专家)荣誉,点击蓝字查看我的出书之路

日常分享高质量文章,输出 Go 面试、工作经验、架构设计,加微信拉读者交流群,和大家交流!

原创不易 点赞支持

  • 26
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值