为什么Go的Logger没有关闭与syslog的连接?

时间:2015-10-30 20:17:30

标签: service go syslog

我正在写一份我正在写的服务。我把它记录到syslog中,如下所示:http://technosophos.com/2013/09/14/using-gos-built-logger-log-syslog.html

但是当我通过CTRL-C终止服务时,某些东西会让连接打开到syslogd。无论如何我都无法开始清理。我缺少什么

e.g。我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的指令也无济于事。 编辑:这是错误:恐慌:运行时错误:无效的内存地址或无指针取消引用 [signal 0xb code = 0x1 addr = 0x0 pc = 0xcb4fe]

goroutine 1 [正在运行]: log / syslog。(* Writer).Close(0x0,0x0,0x0)     /usr/local/Cellar/go/1.5.1/libexec/src/log/syslog/syslog.go:177 + 0x10e main.main段(0x3)

毫无疑问,我做错了。只是一个还没有看到位置的新手。

1 个答案:

答案 0 :(得分:0)

问题在于程序最初的结构方式。 main()线程在记录goroutine之前退出,因此是孤立的连接。经过重构以防止这种情况发生后,问题就消失了。