GoLang 将 STDOUT 和 STDERR 写入 log15 文件

标签 go logging

我有 GoLang 应用程序,我使用 log15 将日志写入文件。我用于 log15 的包是 gopkg.in/inconshreveable/log15.v2 我遇到了一种情况,我想将 STDERR 和 STDOUT 的信息写入我写入 log15 日志的同一文件中。有没有可能的方法来实现相同的目标

最佳答案

您可以使用管道捕获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 黑客),不确定如何实现这一点

关于GoLang 将 STDOUT 和 STDERR 写入 log15 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51709744/

相关文章:

regex - Golang 正则表达式匹配并替换特定字符串后的第一次出现

logging - 哪些是运行程序的最佳 Haskell 库?

python - 如何按时间读取日志文件并提取不包含数据信息的特定行

azure - 如何使用 Go SDK 在 Azure AD 中创建新组?

go - 通过 GUID 卸载应用程序

Javascript - 读取经常更新的文件

hadoop - 在Hive UDF中记录消息

python - 从 pymongo 映射缩减操作记录/打印

javascript - 在脚本标签中使用 HTML/模板进行 HTML Dom 注入(inject)

mongodb - Mongodb 中的投影无法正常工作