最近一个新项目使用了Golang WEB框架Gin,之前也用过这个框架,都挺好的,但最近发现一个奇怪的问题就是Gin没有输出任何日志内容。(包括终端和日志文件)
代码分析
先上代码:
// 启动Gin
func Start() {
//Gin运行默认
RunMode := controller.ConfigGet("servers.RunMode")
gin.SetMode(RunMode)
//日志记录到文件
f, _ := os.Create("logs/run.log")
gin.DefaultWriter = io.MultiWriter(f)
//日志同时输出到控制台
gin.DefaultWriter = io.MultiWriter(f, os.Stdout)
//运行Gin
r := gin.Default()
//使用跨域中间件
r.Use(cors())
//路由配置
r.GET("/api/check/icmp", auth(), controller.CheckIcmp)
r.GET("/api/check/tcp", auth(), controller.CheckTcp)
//获取服务端配置
port := controller.ConfigGet("servers.port")
r.Run(port)
}
乍一看,这代码似乎没有什么问题,而且启动的时候没有任何报错。一开始以为是Gin的BUG,但是对比了其它项目的Gin版本,都是一样的,而且代码内容几乎一样。网上也没有搜到类似的情况。
问题解决
最后经过长时间的折腾发现问题出在f, _ := os.Create("logs/run.log")
这一行代码,os.Create()
只会创建文件,而如果父级目录不存在的话,是不会自动创建目录的,从而导致logs/run.log
并没有创建成功,从而影响了Gin框架的日志输出。
那么要解决这个问题,有2个办法:
- 提前创建好日志文件夹
logs
这个目录 - 或者先判断日志目录是否存在,不存在则用
os.Mkdir()
函数创建
最后
还是怪自己粗心大意,开发还是要认真严谨才行。如果你也有遇到类似Gin不输出日志问题,不妨看看是否是日志文件夹不存在导致。