繁体   English   中英

使用日志 package 附加到当前行

Appending to current line with log package

提示:本站收集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
2 个回复

这是无法实现的。 记录 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 专家,所以我愿意发表评论。

4 R:根据另一列的值将其他行的值附加到当前行

我有一个类似以下的数据框(alter.hh2): 对于每一行,我想将同一周的flavor(如果有不同的值),mean_multi和brd的值附加到其上,如下所示,同时保持其余各行的其余值不变: 如果每周有两个以上的值,我希望结果(迭代地)如下所示: 我已经尝试过通过重塑软 ...

6 VIM-如何将当前行号附加到键映射中?

我在.vimrc有此映射: 保存当前文件并使用rspec在控制台中运行它。 我该如何映射另一个键来像这样将当前行添加到末尾? 我所能找到的只是CTRL + G,它显示了当前位置。 但是无法弄清楚如何将其转换为映射。 ...

2014-06-02 14:51:27 1 134   vim
7 Python-遍历2D列表-将值附加到当前行或删除它

我正在尝试遍历2D列表,并且取决于因素,要么追加到行中,要么删除整行 如果tempX匹配某个值,则应将tempX和tempY附加到列表中的当前行。 如果tempX与该值不匹配,则应从列表中删除整行。 到目前为止,这是代码。 预期结果: aList = [[6, 7, 8, ...

9 Bash脚本不适合新行,将文本附加到当前行

我有一个脚本,在运行命令xyz后将stdout重定向到日志文件。 我尝试在控制台中执行此操作: 当我看到temp.log它完美如我所期待的那样。 但是当我在脚本中运行上面的命令时,temp.log只是所有stdout的一大行。 如何使其打印与从控制台运行它相同? 我已经在下面显示 ...

2013-02-12 17:49:20 1 107   bash
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM