为什么 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 之前退出,因此孤立了连接。在重构以防止这种情况发生后,问题就消失了。