①按照beego官方文档配置好日志输出到文件的策略:
// beego logs config
package config
import (
"fmt"
"github.com/astaxie/beego"
"github.com/astaxie/beego/logs"
)
func init() {
//logConf record code file and line
logs.EnableFuncCallDepth(true)
//enable async logConf
//logs.Async()
//get logConf conf
logPath := beego.AppConfig.String("sys_log_path")
maxsize := beego.AppConfig.DefaultInt("maxsize", 10) * 1024 * 1024
maxDays := beego.AppConfig.DefaultInt("max_days", 7)
//set common logger that saves all logConf
logConf := fmt.Sprintf(`{"filename":"%s","maxsize":%d,"daily":true,"maxdays":%d,"rotate":true,"level":%d}`, logPath, maxsize, maxDays, logs.LevelDebug)
err := logs.SetLogger(logs.AdapterFile, logConf)
if err != nil {
panic(err)
}
}
②在main方法导入config包
package main
package main
import (
"flag"
"github.com/astaxie/beego"
_ "networkmgr/config"
_ "networkmgr/models/log"
_ "networkmgr/routers"
)
func loadConfig() {
configpath := flag.String("config", "./conf/app.conf", "config:default is app.conf")
flag.Parse()
beego.LoadAppConfig("ini", *configpath)
if beego.BConfig.RunMode == "dev" {
beego.BConfig.WebConfig.DirectoryIndex = true
beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"
}
}
func main() {
loadConfig()
beego.Run()
}
③启动项目,问题出现。日志文件只记录了动态路由生成日志,后续日志无记录。
④进入beego/logs源码进行debug,发现在后续日志记录时beegoLogger的outputs(输出终端)列表中只有console
⑤debug到①步的logs.SetLogger()方法中去,发现beegoLogger的outputs列表中有2个元素:console、file
⑥显而易见,在config包初始化log后,框架又对log的outputs值进行了修改,接下来就寻找哪里对outputs值进行了修改
⑦查找outputs的useage,发现beego/logs/log.go中的reset方法对其值进行了修改,比较可疑
⑧在reset方法处打断点,查看调用栈,发现reset方法在项目启动时有2处调用,一是beego包的init方法引起,但考虑到config包引入了beego包,所以config包的init方法是在beego包的init方法后执行,所以排除此处;二是在beego.LoadAppConfig()方法时间接调用了log的reset方法,重置了outputs
⑨至此问题原因找到,解决方法很简单,将初始化方法改名,并在main方法中的loadConfig方法之后手动调用