一,需求说明:
我们的go程序的访问日志用了zap的BufferedWriteSyncer,
默认一分钟后写入到磁盘,如果这时候go应用发生意外退出,
则日志可能不能落盘,
所以gin退出前,要把未执行的工作先结束才行
二,代码例子:
package mainimport "C"
import ("fmt""imagebank/global""imagebank/routes""os""os/signal""syscall""time"
)// 入口函数
func main() {//记录启动时间global.AppStartTime = time.Now()//日志初始化global.SetupAccessLogger()//数据库连接初始化global.SetupDBLink()defer global.LoggerAccess.Sync()defer global.LogFileAccess.Close()//引入路由r := routes.Routes()// r.Run(":8080")// 异步go func() {//runr.Run(":8080")}()// 如果想要接收到信号quit := make(chan os.Signal)// sigint 是有 CTRL+C 触发,进程可以捕获信号,并进行处理,// SIGTERM是有 kill 命令触发,进程可以捕获信号,并进行处理,// SIGKILL是有 kill -9 命令触发,进程无法捕获。signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)<-quitfmt.Println("开始关闭gin server...")// 处理后续逻辑global.LoggerAccess.Sync()global.LogFileAccess.Close()}
三,测试效果:
kill进程id
[GIN] 2025/02/20 - 11:36:42 | 200 | 357.652µs | 192.168.219.1 | GET "/image/list?a=1&bc=2&c=aaa"
开始关闭gin server...
用CTRL+C中断
[GIN] 2025/02/20 - 11:31:10 | 200 | 285.987µs | 192.168.219.1 | GET "/image/list?a=1&bc=2&c=aaa"
^C开始关闭gin server...