2

大家好,我是煎鱼。

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

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

Logdy 极简日志系统

基本使用

这个新开源库 logdyhq/logdy-core 给自己打的标语是:“使用 Web 浏览器 UI 和低代码增强终端日志,节省 90% 的搜索和浏览日志的时间”。看着就很省钱,一下子就引起了我的关注。

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

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,可以看到日志系统界面如下:

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

字段配置

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

以下是更进一步的 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 自动生成字段格式:

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

进阶使用

最偏向公司项目实战的基本门槛,我认为还得是 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 地址:

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

总结

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

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

文章持续更新,可以微信搜【脑子进煎鱼了】阅读,本文 GitHub github.com/eddycjy/blog 已收录,学习 Go 语言可以看 Go 学习地图和路线,欢迎 Star 催更。

推荐阅读


煎鱼
8.4k 声望12.8k 粉丝