Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 有没有什么有效的方法可以在Unix下轻松获取Go程序的紧急日志?_Linux_Unix_Logging_Go_Panic - Fatal编程技术网

Linux 有没有什么有效的方法可以在Unix下轻松获取Go程序的紧急日志?

Linux 有没有什么有效的方法可以在Unix下轻松获取Go程序的紧急日志?,linux,unix,logging,go,panic,Linux,Unix,Logging,Go,Panic,因为我正在运行一个Go程序作为服务器,所以我需要一些机制,以便在以后的分析和调试中发现任何错误时捕获紧急日志。有没有什么有效的方法可以在Unix下轻松获取Go程序的紧急日志?你们能介绍一下你们的经验吗?谢谢:)可以通过编程捕获一些故障并为它们处理紧急日志。但它不适用于OOM错误或死锁 有限的情况可以举例说明如下: package main import ( "fmt" "os" "runtime" ) func fact(n int) int

因为我正在运行一个Go程序作为服务器,所以我需要一些机制,以便在以后的分析和调试中发现任何错误时捕获紧急日志。有没有什么有效的方法可以在Unix下轻松获取Go程序的紧急日志?你们能介绍一下你们的经验吗?谢谢:)

可以通过编程捕获一些故障并为它们处理紧急日志。但它不适用于OOM错误或死锁

有限的情况可以举例说明如下:

package main

import (
        "fmt"
        "os"
        "runtime"
)

func fact(n int) int {
        if 1/n == 42 {
                return 314
        }

        return n * fact(n-1)
}

func main() {
        const maxTrace = 1000
        defer func() {
                if e := recover(); e != nil {
                        fmt.Fprintf(os.Stderr, "Panic log, recovered: '%v'", e)
                        var b [maxTrace]byte
                        fmt.Fprintf(os.Stderr, "%s", b[:runtime.Stack(b[:], true)])
                }
        }()

        fact(3)
}


输出:

Panic log, recovered: 'runtime error: integer divide by zero'goroutine 1 [running]:
main.func·001()
        /tmpfs/gosandbox-9ec179e4_f9a94b22_357f29a2_2f5f25c4_b484febf/prog.go:23 +0x14b
main.fact(0x0, 0x4103f1)
        /tmpfs/gosandbox-9ec179e4_f9a94b22_357f29a2_2f5f25c4_b484febf/prog.go:10 +0x2b
main.fact(0x1, 0x0)
        /tmpfs/gosandbox-9ec179e4_f9a94b22_357f29a2_2f5f25c4_b484febf/prog.go:14 +0x54
main.fact(0x2, 0x0)
        /tmpfs/gosandbox-9ec179e4_f9a94b22_357f29a2_2f5f25c4_b484febf/prog.go:14 +0x54
main.fact(0x3, 0x401005)
        /tmpfs/gosandbox-9ec179e4_f9a94b22_357f29a2_2f5f25c4_b484febf/prog.go:14 +0x54
main.main()
        /tmpfs/gosandbox-9ec179e4_f9a94b22_357f29a2_2f5f25c4_b484febf/prog.go:27 +0x37

要捕获任何类型进程崩溃(包括OOM和死锁)时所有goroutine的堆栈跟踪,请将其stderr重定向到任何所需的位置(例如管道、文件)。

我在手机上收到一条通知,告知我的一些go程序出现了致命的恐慌。以下是方法:

首先,我通常在(或类似)下运行所有内容,因此它会受到监控,并在出现故障时重新启动

然后,我通常使用内置的日志包登录到syslog。我的系统日志转发到我可以查看事物状态、设置警报等的地方。。。在这里,我将不良事件通知转发到一个电子邮件地址,这样我就可以了解问题,搜索类似的最近问题,查看问题的上下文,等等

…但是您无法记录自己的未捕获的致命恐慌,因此我编写了执行程序并分别记录其stdout和stderr以及不成功的退出通知

例如:

logexec -tag myprogram /path/to/myprogram -and -its arguments

例如,您可以将go程序附加到rsyslogd。