为什么 Go 的 Logger 不关闭与 syslog 的连接?
Why is Go's Logger not closing connections to syslog?
我正在编写的服务有问题。我让它像这样记录到系统日志:http://technosophos.com/2013/09/14/using-gos-built-logger-log-syslog.html
但是当我通过 CTRL-C 终止服务时,某些东西使连接打开到 syslogd。反正我看不到启动清理。我错过了什么
例如syslog.Writer.Close()
对我来说似乎无法访问,但我可以说清理没有发生。我看到连接卡在 CLOSE_WAIT 状态,我的 syslogd 开始停滞不前并变得不合作。
示例:
package main
import (
"github.com/davecgh/go-spew/spew" // DEBUG
"log"
"log/syslog"
"os"
"os/signal"
"syscall"
)
func main() {
logWriter, err := syslog.New(syslog.LOG_NOTICE, "mybrokenprog")
spew.Dump(logWriter) // DEBUG
spew.Dump(err) // DEBUG
if err == nil {
log.SetOutput(logWriter)
}
chansigs := make(chan os.Signal, 1)
signal.Notify(chansigs, os.Interrupt, syscall.SIGTERM, syscall.SIGKILL)
log.Print("writing to syslog. waiting for shutdown signal")
for {
sig := <-chansigs // we just wait here for a signal to shutdown
log.Print("signal received...shutting down")
logWriter.Close() // but this throws the panic excerpted below
if sig == os.Interrupt {
os.Exit(0)
}
os.Exit(1)
}
}
编辑:上面的代码解决了这个问题。看到评论。重新启动以清除与 syslog 的卡住连接解决了该问题。一旦他们在那里,他们就会坚持不懈。甚至 OS X 的重新启动 syslogd 的说明也无济于事。
编辑:这是错误:恐慌:运行时错误:无效的内存地址或零指针取消引用
[信号 0xb 代码=0x1 地址=0x0 pc=0xcb4fe]
协程 1 [运行]:
log/syslog.(*作家).关闭(0x0, 0x0, 0x0)
/usr/local/Cellar/go/1.5.1/libexec/src/log/syslog/syslog.go:177 +0x10e
main.main(0x3)
我毫不怀疑我做错了。菜鸟一枚,还没看懂。
问题出在程序最初的结构方式上。 main() 线程在日志记录 goroutine 之前退出,因此孤立了连接。在重构以防止这种情况发生后,问题就消失了。
我正在编写的服务有问题。我让它像这样记录到系统日志:http://technosophos.com/2013/09/14/using-gos-built-logger-log-syslog.html
但是当我通过 CTRL-C 终止服务时,某些东西使连接打开到 syslogd。反正我看不到启动清理。我错过了什么
例如syslog.Writer.Close()
对我来说似乎无法访问,但我可以说清理没有发生。我看到连接卡在 CLOSE_WAIT 状态,我的 syslogd 开始停滞不前并变得不合作。
示例:
package main
import (
"github.com/davecgh/go-spew/spew" // DEBUG
"log"
"log/syslog"
"os"
"os/signal"
"syscall"
)
func main() {
logWriter, err := syslog.New(syslog.LOG_NOTICE, "mybrokenprog")
spew.Dump(logWriter) // DEBUG
spew.Dump(err) // DEBUG
if err == nil {
log.SetOutput(logWriter)
}
chansigs := make(chan os.Signal, 1)
signal.Notify(chansigs, os.Interrupt, syscall.SIGTERM, syscall.SIGKILL)
log.Print("writing to syslog. waiting for shutdown signal")
for {
sig := <-chansigs // we just wait here for a signal to shutdown
log.Print("signal received...shutting down")
logWriter.Close() // but this throws the panic excerpted below
if sig == os.Interrupt {
os.Exit(0)
}
os.Exit(1)
}
}
编辑:上面的代码解决了这个问题。看到评论。重新启动以清除与 syslog 的卡住连接解决了该问题。一旦他们在那里,他们就会坚持不懈。甚至 OS X 的重新启动 syslogd 的说明也无济于事。 编辑:这是错误:恐慌:运行时错误:无效的内存地址或零指针取消引用 [信号 0xb 代码=0x1 地址=0x0 pc=0xcb4fe]
协程 1 [运行]: log/syslog.(*作家).关闭(0x0, 0x0, 0x0) /usr/local/Cellar/go/1.5.1/libexec/src/log/syslog/syslog.go:177 +0x10e main.main(0x3)
我毫不怀疑我做错了。菜鸟一枚,还没看懂。
问题出在程序最初的结构方式上。 main() 线程在日志记录 goroutine 之前退出,因此孤立了连接。在重构以防止这种情况发生后,问题就消失了。