大家好,我是煎鱼。
在目前降本增效的大浪潮下,很多甲方给的服务器资源非常稀缺,又或是乙方做 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 催更。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。