大家好,我是煎鱼。
在目前降本增效的大浪潮下,很多甲方给的服务器资源非常稀缺,又或是乙方做 OP 时,需要以更合理的应用资源去报价,以此取得一定的综合优势。
这种情况下,日志系统常常被削减甚至是去掉的一个组件。为此,一个极简方案就非常有必要了。最近在冲浪时,发现了个新起之秀。分享新轮子给大家。
Logdy 极简日志系统
基本使用
这个新开源库 logdyhq/logdy-core[1] 给自己打的标语是:“使用 Web 浏览器 UI 和低代码增强终端日志,节省 90% 的搜索和浏览日志的时间”。
看着就很省钱,一下子就引起了我的关注。
![8f980a34e711cd314798bd64df793b8b.png](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/a8983a603a690603a1264607ddc4f61e.png)
设置后再查看,就会直观许多:
![7ae1fef4f4a0c5f31e9514973ad61974.png](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/016be36ff8edec06ae9038d677acc7eb.png)
这样一来就可以基于 VSCode 提供的功能实现在 IDE 中看日志了。
![9e77f634f15b2d2a647b443c0e45a222.png](https://img-blog.csdnimg.cn/img_convert/9e77f634f15b2d2a647b443c0e45a222.png)
总结
今天给大家分享了一个极简日志系统的新轮子 logdy,这目前还在活跃开发阶段,如果大家有什么新的想法或需要加强的点,都可以及时尝试后提给社区开发者。
如果能够成型成熟的话,对于后面压缩日志系统到极简私有化的环境下,还是有一定的价值的。
推荐阅读
参考资料
[1]
logdyhq/logdy-core: https://github.com/logdyhq/logdy-core
关注和加煎鱼微信,
一手消息和知识,拉你进技术交流群👇
你好,我是煎鱼,出版过 Go 畅销书《Go 语言编程之旅》,再到获得 GOP(Go 领域最有观点专家)荣誉,点击蓝字查看我的出书之路。
日常分享高质量文章,输出 Go 面试、工作经验、架构设计,加微信拉读者交流群,和大家交流!
原创不易 点赞支持