Как изменить формат даты и времени пакета журнала Go

При использовании пакета журнала Go выводит что-то вроде

2009/11/10 23:00:00 Hello, world

Как изменить формат даты и времени на что-то вроде dd.mm.yyy hh:mm:ss? Пример (ссылка на игровые площадки):

package main

import "log"

func main() {
    log.Println("Hello, playground")
}

Ответ 1

Как сказал yed posterior, вы можете определить пользовательский io.Writer, выполнив функцию записи. Вы также, вероятно, захотите сделать log.SetFlags(0), чтобы получить полный контроль. Вот пример, который изменяет формат даты, а также добавляет информацию об уровне журнала.

type logWriter struct {
}

func (writer logWriter) Write(bytes []byte) (int, error) {
    return fmt.Print(time.Now().UTC().Format("2006-01-02T15:04:05.999Z") + " [DEBUG] " + string(bytes))
}

func main() {

    log.SetFlags(0)
    log.SetOutput(new(logWriter))
    log.Println("This is something being logged!")
}

выходы:

2016-03-21T19: 54: 28.563Z [DEBUG] Это что-то записывается!

Ответ 2

Согласно источнику (http://golang.org/src/pkg/log/log.go), нет встроенного способа сделать это:

26      // Bits or'ed together to control what printed. There is no control over the
27      // order they appear (the order listed here) or the format they present (as
28      // described in the comments).  A colon appears after these items:
29      //  2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message

Для этого вам потребуется использовать сторонний пакет или перехватить вывод журнала, как описано выше.

Ответ 3

Используйте настраиваемый сценарий, который фильтрует строки журнала, чтобы изменить их в нужном формате. Это должно быть легко, потому что формат заголовка является регулярным и фиксированным. Затем вызовите log.SetOutput(myFilterWriter (os.Stderr)).