提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我正在编写一个 Go 程序,并使用log
package 写入日志文件,以便每个新行都附加一个时间戳。 有时我只想将 append 文本添加到当前行,而不是使用前置时间戳开始新行。
我认为log.Print()
方法可以做到这一点,因为文档说它应该以与 fmt.Print() 相同的方式工作。 相反,我发现每次调用Print()
都会生成一个带有时间戳的新行。 我在 package 中找不到另一种方法,可以满足我的要求。
有没有办法做到这一点?
示例程序:
logFile, err := os.Create("myLog.log")
defer logFile.Close()
logger := log.New(logFile, "", log.LstdFlags)
logger.Println("Starting first round")
for i := 1; i < 4; i++ {
request, err := http.NewRequest("GET", "http://www.someapi.com/pgNum=" + i, nil)
response, err := client.Do(request)
logger.Print(".")
}
logger.Println("Starting second round")
for j := 1; j < 4; j++ {
request, err := http.NewRequest("GET", "http://www.someotherapi.com/pgNum=" + j, nil)
response, err := client.Do(request)
logger.Print(".")
}
logger.Println("Done")
当前 output:
2019/09/18 13:27:49 Starting first round
2019/09/18 13:27:49 .
2019/09/18 13:27:50 .
2019/09/18 13:27:51 .
2019/09/18 13:27:52 Starting second round
2019/09/18 13:27:52 .
2019/09/18 13:27:53 .
2019/09/18 13:27:54 .
2019/09/18 13:27:55 Done
所需的 output:
2019/09/18 13:27:49 Starting first round...
2019/09/18 13:27:52 Starting second round...
2019/09/18 13:27:55 Done
这是无法实现的。 记录 package 总是添加行尾字符。 见log.go 第 169 行。
日志可以由许多例程编写,因此您无法保证附加到先前记录的行。
Grzegorz Żur 的回答是正确的。 由于log
package 总是在写入日志的每个字符串的末尾附加一个新行,因此在使用该 Writer 时,即使您引入不同类型的 Writer 也无法在该行末尾添加更多文本做附加。 我最终不得不自己动手。
Package:
package mylogger
import (
"os"
"bufio"
"time"
)
var logWriter *bufio.Writer
func InitLogFile() (*os.File, error) {
logFile, err := os.Create(logPath)
if err != nil {
return nil, err
}
logWriter = bufio.NewWriter(logFile)
return logFile, nil
}
func Print(msg string) {
if logWriter != nil {
logWriter.WriteString(msg)
logWriter.Flush()
}
}
func NewLine(msg string) {
if logWriter != nil {
logWriter.WriteString("\n" + time.Now().Format("2006/02/01 15:04:05") + " " + msg)
logWriter.Flush()
}
}
主程序:
logFile, err := mylogger.InitLogFile()
defer logFile.Close()
mylogger.NewLine("Starting first round")
for i := 1; i < 4; i++ {
request, err := http.NewRequest("GET", "http://www.someapi.com/pgNum=" + i, nil)
response, err := client.Do(request)
mylogger.Print(".")
}
mylogger.NewLine("Starting second round")
for j := 1; j < 4; j++ {
request, err := http.NewRequest("GET", "http://www.someotherapi.com/pgNum=" + j, nil)
response, err := client.Do(request)
mylogger.Print(".")
}
mylogger.NewLine("Done")
这得到了我想要的结果。
重要说明:这仅适用于我的程序在单个线程中运行并且具有线性流。 如果有任何并发性,不同的子例程可以随时调用日志记录 function,这将很快崩溃。
这不是我的实际程序,而是它所做的一个简短的要点。 为简洁起见省略了错误处理。 我不是 Go 专家,所以我愿意发表评论。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.