GoLang将STDOUT和STDERR写入log15文件
我有一个GoLang应用程序,我使用log15将日志写入文件。我用于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
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,但不会写入文件