There are situations where a program will fail for good, and you want to have as much information about the failure as possible. In such difficult circumstances, you might consider using log.Panic(), which is the logging function that is illustrated in this section using the Go code of logPanic.go.
The Go code of logPanic.go follows:
package main import ( "fmt" "log" "log/syslog" ) func main() { sysLog, err := syslog.New(syslog.LOG_ALERT|syslog.LOG_MAIL,
"Some program!") if err != nil { log.Fatal(err) } else { log.SetOutput(sysLog) } log.Panic(sysLog) fmt.Println("Will you see this?") }
Executing logPanic.go on macOS High Sierra will produce the following output:
$ go run logPanic.go panic: &{17 Some program! iMac.local {0 0} 0xc42000c220} goroutine 1 [running]: log.Panic(0xc42004ff50, 0x1, 0x1) /usr/local/Cellar/go/1.9.1/libexec/src/log/log.go:330 +0xc0 main.main() /Users/mtsouk/Desktop/masterGo/ch/ch1/code/logPanic.go:17 +0xea exit status 2
Running the same program on a Debian Linux machine with Go version 1.3.3 will generate the following output:
$ go run logPanic.go panic: &{17 Some program! mail {0 0} 0xc2080400e0} goroutine 16 [running]: runtime.panic(0x4ec360, 0xc208000320) /usr/lib/go/src/pkg/runtime/panic.c:279 +0xf5 log.Panic(0xc208055f20, 0x1, 0x1) /usr/lib/go/src/pkg/log/log.go:307 +0xb6 main.main() /home/mtsouk/Desktop/masterGo/ch/ch1/code/logPanic.go:17 +0x169 goroutine 17 [runnable]: runtime.MHeap_Scavenger() /usr/lib/go/src/pkg/runtime/mheap.c:507 runtime.goexit() /usr/lib/go/src/pkg/runtime/proc.c:1445 goroutine 18 [runnable]: bgsweep() /usr/lib/go/src/pkg/runtime/mgc0.c:1976 runtime.goexit() /usr/lib/go/src/pkg/runtime/proc.c:1445 goroutine 19 [runnable]: runfinq() /usr/lib/go/src/pkg/runtime/mgc0.c:2606 runtime.goexit() /usr/lib/go/src/pkg/runtime/proc.c:1445 exit status 2
The output of log.Panic() includes additional low-level information that will hopefully help you resolve difficult and rare situations that happen in your Go code.
Analogous to the log.Fatal() function, the use of the log.Panic() function will add an entry to the proper log file and will immediately terminate the Go program.