Как я могу печатать на Stderr в Go без использования журнала
Как написать сообщение Stderr без использования log
?
Комментарий в этом сообщении SO показывает, как это сделать с помощью log
: log.Println("Message")
, но что, если мне не нужна метка времени?
Является ли следующий хороший Go?
os.Stderr.WriteString("Message")
Ответы
Ответ 1
Если вы не хотите отметки времени, просто создайте новый log.Logger
с flag
, установленным на 0
:
l := log.New(os.Stderr, "", 0)
l.Println("log msg")
EDIT:
Является ли следующий хороший Go?
os.Stderr.WriteString("Message")
Это приемлемо, и вы также можете использовать fmt.Fprintf
и друзей для получения отформатированного вывода:
fmt.Fprintf(os.Stderr, "number of foo: %d", nFoo)
Ответ 2
Используя пакет fmt
, вы можете выбрать stderr
следующим образом:
import "fmt"
import "os"
func main() {
fmt.Fprintln(os.Stderr, "hello world")
}
Ответ 3
os.Stderr
является io.Writer
, поэтому вы можете использовать его в любой функции, которая принимает io.Writer
. Вот несколько примеров:
str := "Message"
fmt.Fprintln(os.Stderr, str)
io.WriteString(os.Stderr, str)
io.Copy(os.Stderr, bytes.NewBufferString(str))
os.Stderr.Write([]byte(str))
Все зависит от того, как именно у вас есть строка, которую вы хотите распечатать (т.е. если вы хотите отформатировать ее в первую очередь, если у вас она есть как io.Reader
, если у вас это как байтовый срез...). И может быть намного больше способов.
Ответ 4
По умолчанию флаги журнала устанавливаются на Ldate | Ltime
. Вы можете изменить формат регистратора на любое из следующих (из документации журнала golang):
Ldate = 1 << iota // the date in the local time zone: 2009/01/23
Ltime // the time in the local time zone: 01:23:23
Lmicroseconds // microsecond resolution: 01:23:23.123123. assumes Ltime.
Llongfile // full file name and line number: /a/b/c/d.go:23
Lshortfile // final file name element and line number: d.go:23. overrides Llongfile
LUTC // if Ldate or Ltime is set, use UTC rather than the local time zone
LstdFlags = Ldate | Ltime // initial values for the standard logger
Например, флаги Ldate | Ltime (или LstdFlags) производят
2009/01/23 01:23:23 message
В то время как флаги Ldate | Бюджет | Lmicroseconds | Llongfile производит,
2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message
Вы также можете установить регистратор по умолчанию, чтобы ничего не печатать, установив флаг в 0:
log.SetFlags(0)