2015-10-30 54 views
1

我在寫一個服務時遇到問題。我有它登錄到系統日誌是這樣的:http://technosophos.com/2013/09/14/using-gos-built-logger-log-syslog.htmlGo's Logger爲什麼不關閉與syslog的連接?

但當我通過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) 
    } 
} 

編輯:上述代碼解決該問題。看到評論。重新啓動以清除連接到系統日誌的問題修復了問題。一旦他們在那裏,他們堅持不懈。即使OS X關於重新啓動syslogd的說明也沒有幫助。 編輯:這是錯誤:恐慌:運行時錯誤:無效的內存地址或零指針引用 [信號0XB代碼=爲0x1 ADDR =爲0x0 PC = 0xcb4fe]

夠程1 [運行]: 日誌/系統日誌( * Writer).Close(0x0,0x0,0x0) /usr/local/Cellar/go/1.5.1/libexec/src/log/syslog/syslog.go:177+0x10e main.main(0x3)

我毫不懷疑我做錯了。只是一個尚未看到在哪裏的新手。

+0

爲什麼說'syslog.Writer.Close()'是無法訪問?你在你發佈的鏈接中明確地創建了一個'syslog.Writer'。 – JimB

+0

我添加了一些信息和示例代碼。謝謝! – n8gard

+0

這並不顯示你如何處理清理。當你調用'Close()'時,看起來'logWriter'是'nil'。 – JimB

回答

0

問題在於程序最初的結構。 main()線程在日誌goroutine之前退出,因此成爲孤立連接。重構以防止出現問題後,問題就消失了。