Go语言宕机恢复(recover)原链接
Recover 是一个Go语言的内建函数,可以让进入宕机流程中的 goroutine 恢复过来,recover 仅在延迟函数 defer 中有效,在正常的执行过程中,调用 recover 会返回 nil 并且没有其他任何效果,如果当前的 goroutine 陷入恐慌,调用 recover 可以捕获到 panic 的输入值,并且恢复正常的执行。
Go语言没有异常系统,其使用 panic 触发宕机类似于其他语言的抛出异常,recover 的宕机恢复机制就对应其他语言中的 try/catch 机制。
panic 和 recover 的关系
panic 和 recover 的组合有如下特性:
- 有 panic 没 recover,程序宕机。
- 有 panic 也有 recover,程序不会宕机,执行完对应的 defer 后,从宕机点退出当前函数后继续执行。
虽然 panic/recover 能模拟其他语言的异常机制,但并不建议在编写普通函数时也经常性使用这种特性。
seelog日志文件
<seelog minlevel="debug" maxlevel="critical">
<exceptions>
<exception filepattern="*main.go" minlevel="error"/>
</exceptions>
<outputs formatid="monitor">
<!-- outputs里面是日志的配置 -->
<console/>
<buffered formatid="rolling" size="1000" flushperiod="1000">
<!-- buffered缓冲设置 刷新间隔 -->
<rollingfile type="date" filename="./log/monitor/web.log" datepattern="2006.01.02" maxrolls="30" />
<!-- rollingfile里面是日志的设置 -->
<!-- type回滚方式 日志保存最久时间 -->
</buffered>
<filter levels="error">
<file path="./log/monitor/error.log"/>
<!-- <smtp senderaddress="noreply-notification-service@none.org"
sendername="Automatic notification service"
hostname="mail.none.org"
hostport="587"
username="nns"
password="123">
<recipient address="john-smith@none.com"/>
<recipient address="hans-meier@none.com"/>
</smtp>-->
<!-- <conn net="tcp4" addr="server.address:5514" tls="true" insecureskipverify="true" />-->
</filter>
</outputs>
<formats>
<!-- formats里面是日志输出格式配置 -->
<format id="monitor" format="%Date/%Time [%LEV] <%File %Line> %Msg%n"/>
<format id="rolling" format="%Date/%Time [%LEV] <%File %Line> %Msg%n"/>
</formats>
</seelog>
seelog配置文件
func LogConfig() {
logger, err := logs.LoggerFromConfigAsFile("seelog.xml")
if err != nil {
fmt.Println(err)
return
}
logs.ReplaceLogger(logger)
}