GoLang将STDOUT和STDERR写入log15文件

GoLang将STDOUT和STDERR写入log15文件,go,logging,Go,Logging,我有一个GoLang应用程序,我使用log15将日志写入文件。我用于log15的包是gopkg.in/unhreveable/log15.v2我遇到了这样一种情况:我想将STDERR和STDOUT的信息写入我写入log15日志的同一个文件中。是否有任何可能的方法来实现创建日志文件以记录stderr或stdout数据的相同功能。使用OpenFile创建一个文件,然后SetOutput将文件设置为 f, err := os.OpenFile("EDUC_LOG", os.O_RDWR|os.O_CR

我有一个GoLang应用程序,我使用log15将日志写入文件。我用于log15的包是
gopkg.in/unhreveable/log15.v2
我遇到了这样一种情况:我想将STDERR和STDOUT的信息写入我写入log15日志的同一个文件中。是否有任何可能的方法来实现创建日志文件以记录stderr或stdout数据的相同功能。使用
OpenFile
创建一个文件,然后
SetOutput
将文件设置为

f, err := os.OpenFile("EDUC_LOG", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0664)

if err != nil {
    panic(err)
}

defer f.Close()

log.SetOutput(f)
这将在您每次尝试记录某个值时将输出打印到日志文件中,如发生错误时

if err != nil{
       log.Println(err) // this will create a file if not created to output the log in a file.
}
编辑:

致命错误将在标准输出而不是文件中打印输出,因为程序将在写入文件之前退出

package main

import (
    "log"
)

func main() {
    log.Println("error1")
    log.Fatal("error1")
    log.Println("error2") // this will not print since the program will exit the main with fatal error
}

您可以使用管道捕获
os.Stdout
,并使用
io.MultiWriter将输出重定向到实际的Stdout和您的文件

f, _ := os.OpenFile("my.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0664)
multiWriter := io.MultiWriter(os.Stdout, f)
rd, wr, err := os.Pipe()
if err != nil {
    os.Exit(1)
}

// overwrite os.Stdout
os.Stdout = wr

go func() {
    scanner := bufio.NewScanner(rd)
    for scanner.Scan() {
        stdoutLine := scanner.Text()
        multiWriter.Write([]byte(stdoutLine + "\n"))
    }
}()


fmt.Println("foobar")

// hacky sleep to ensure the go routine can write before program exits
time.Sleep(time.Second) 
当然,您可以将相同的应用于
os.Stderr

不过,您必须找到如何获得
log15
文件的句柄,但这应该不会太难


这种方法可能存在的问题是,无法保证goroutine在程序结束时能完成它的工作(请参阅sleep hack),不确定如何实现这一点

这是针对已知错误情况,如何记录意外事件的错误cases@Priya你所说的意外事件是什么意思。如果遇到此问题,请在帖子中添加一些代码段以重新创建案例。该应用程序在windows环境中以.exe格式运行。我的所有紧急错误都由log15记录到日志文件中。我遇到了一个运行时异常,
defer
没有处理该异常。这已经终止了我的应用程序,但没有在日志文件中写入任何错误,因此很难进行修改debug@Priya如果日志使用
log.Fatal
报告
Fatal
错误,则终止应用程序。然后,如果出现错误,它将不会记录错误,它将从程序中退出。在我的情况下,错误将写入stderr,但不会写入文件