Присоединение к текущей строке с пакетом журнала - PullRequest
1 голос
/ 18 сентября 2019

Я пишу программу 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

Ответы [ 2 ]

4 голосов
/ 19 сентября 2019

Этого нельзя достичь.В пакет логирования всегда добавляется символ конца строки.См. log.go строка 169 .

Журналы могут записываться многими подпрограммами, поэтому у вас нет гарантии, что вы присоединитесь к ранее зарегистрированной строке.

1 голос
/ 19 сентября 2019

Grzegorz Żur прав в своем ответе.Поскольку пакет log всегда добавляет новую строку в конец каждой строки, записываемой в журнал, при использовании этого 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")

Получил желаемый результат.

Важное примечание: это работает только потому, что моя программа работает в одном потоке и имеет линейный поток.Если бы был какой-либо параллелизм, когда разные функции могли бы вызывать функцию регистрации в любое время, это очень быстро распадалось бы.

Это не моя настоящая программа, а сокращенная суть того, что она делает.Обработка ошибок опущена для краткости.Я не эксперт по Go, поэтому я открыт для комментариев.

...