Golang: Как войти в fmt.Printf в пользовательский файл - PullRequest
1 голос
/ 13 марта 2019

У меня есть эта функция, которую я использую для входа:

func formattedLog(prefix, m string, color int) {
    fmt.Printf("\033[%dm%s", color, DateTimeFormat)
    fmt.Printf("▶ %s: %s\033[%dm\n", prefix, m, int(Black))
}

Я хочу сохранить вывод журнала в некотором файле:

f, err := os.OpenFile("../../../go-logs.txt", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
    log.Fatal("error opening logs file", err)
}
defer f.Close()
//set output of logs to f
log.SetOutput(f)
log.Println("This is a test log entry") // <====This logs in file

но когда я вызываю свою функцию, которая использует fmt.Printf, она не входит в файл go-logs.txt:

formattedErr("ERR", msg, err.Error(), int(Red))

есть ли в любом случае setoutput также для fmt.Printf

1 Ответ

4 голосов
/ 13 марта 2019

fmt.Printf() документов, которые он записывает на стандартный вывод:

Printf форматирует в соответствии со спецификатором формата, а записывает в стандартный вывод .

То есть fmt.SetOutput() не может перенаправить это в ваш файл.

Но обратите внимание, что стандартный вывод - это переменная в пакете os:

Stdin, Stdout и Stderr - открытые файлы, указывающие на стандартный ввод, стандартный вывод и стандартные дескрипторы файлов ошибок.

Обратите внимание, что среда выполнения Go записывает стандартную ошибку при панике и сбоях; закрытие Stderr может привести к тому, что эти сообщения переместятся в другое место, возможно, в файл, открытый позже.

var (
        Stdin  = NewFile(uintptr(syscall.Stdin), "/dev/stdin")
        Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
        Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")
)

И вам разрешено устанавливать свои os.File на os.Stdout. Хотя не рекомендуется использовать тот же os.File для регистратора, а также установить для него os.Stdout, доступ к его методу File.Write() не будет синхронизирован между пакетом fmt и регистратором.

Лучше всего было бы использовать log.Logger везде (чей вывод вы правильно настроили, чтобы сообщения журнала были правильно сериализованы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...