我正在编写一个Go程序,并使用log包将其写入日志文件,以便每一行都带有一个时间戳。 有时我只是想将文本追加到当前行,而不是使用前置时间戳开始新行。

我认为log.Print()方法可以做到这一点,因为文档说它应该与fmt.Print()一样工作。 相反,我发现对Print()每次调用都会生成带有时间戳的新行。 我在包中找不到满足我需求的其他方法。

有没有办法做到这一点?

示例程序:

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")

电流输出:

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

所需的输出:

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

#1楼 票数:4

这是无法实现的。 记录程序包总是添加行尾字符。 参见log.go第169行

日志可以由许多例程编写,因此不能保证您附加到先前记录的行。

#2楼 票数:1

GrzegorzŻur的回答是正确的。 由于log包始终将新行添加到写入日志的每个字符串的末尾,因此即使使用其他类型的Writer,也无法在使用该Writer时在该行的末尾添加更多文本。做附录。 我最终不得不自己动手。

包:

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")

这得到了我想要的结果。

重要说明:这仅适用于我的程序在单线程中运行并且具有线性流程。 如果存在任何并发性,任何时候都可以在子例程中调用不同的子例程,那么这将很快崩溃。

这不是我的实际程序,而是其工作的简要要点。 为简洁起见,省略了错误处理。 我不是围棋专家,所以我愿意发表评论。

  ask by Seth R translate from so

未解决问题?本站智能推荐:

1回复

停止将日志附加到go.log文件中

我已经使用 Go 1.5.2 卡在 Openshift 上部署了我的 Go 应用程序。 作为一个很好的做法,我养成了生成有关应用程序出现故障的任何日志的习惯。 但事实证明,这种习惯在 Openshift 环境中代价高昂,因为我提供的存储空间 (1 GB) 有限。 日志在使用后的几秒钟内很容易超过 1
1回复

慢日志包

为什么 Go log包会拖慢我的 http API 如此糟糕? 有那么慢吗? 这是我使用httprouter而不记录日志的路由器示例: 使用wrk对该端点进行基准测试,我得到了这个:$ wrk -t1 -d1s -c100 http://localhost:8080/helloRunning 1s
1回复

日志包中的Golang微秒

Golang有标准的日志包。 有没有办法将mircoseconds放到其输出? 标准代码使用非常无用的时间戳和第二个精度:
1回复

为什么不使用锁来同步日志包

我正在阅读日志源代码 ,我在这里感到困惑: 为什么SetOutPut使用mu锁定但SetFlags不使用mu锁定?
1回复

从外部包中进行AWSLambdagolang日志记录

我开始为我的lambda函数使用外部包,这是用Golang编写的。 我使用无服务器框架,如果这有任何区别。 我想在每次DB中出现错误时集中记录错误。 但我注意到日志没有显示在cloudwatch上。 仅显示main包中的日志。 这是我的代码 我也试过了 我的问题是如何在
1回复

在glog包中设置日志级别

如何将 golang glog包的日志记录级别设置为 ERROR。 例子.go:$ go run example.go -logtostderr=true -stderrthreshold=ERRORI1214 15:46:00.743002 13429 example.go:10] Info
1回复

使用io.Multiwriter创建跨包/子包的日志

我是新手。 当前,我正在编写一个工具,它将捕获所有stdout输出,并将它们合并到一个新文件中。 为此,我使用了io.Multiwriter。 但是,我的问题在于,试图捕获跨包和子包的所有stdout输出。 当前,我的方法是创建一个具有所有日志记录排他性作用的新程序包。 每当其他软
2回复

GOlang日志包的局限性

我正在Go中实现logger。 我正在考虑使用logrus。 我想了解内置日志包的限制。 我知道如果我们想将日志写入文件或实现滚动文件日志等,我们需要手动添加此功能。 是否还有其他限制我们必须选择外部日志包?