Пытаюсь записать в лог файл с помощью Go.
Я пробовал несколько подходов, но все они потерпели неудачу. Вот что я пробовал:
func TestLogging(t *testing.T) {
if !FileExists("logfile") {
CreateFile("logfile")
}
f, err := os.Open("logfile")
if err != nil {
t.Fatalf("error: %v", err)
}
// attempt #1
log.SetOutput(io.MultiWriter(os.Stderr, f))
log.Println("hello, logfile")
// attempt #2
log.SetOutput(io.Writer(f))
log.Println("hello, logfile")
// attempt #3
log.SetOutput(f)
log.Println("hello, logfile")
}
func FileExists(name string) bool {
if _, err := os.Stat(name); err != nil {
if os.IsNotExist(err) {
return false
}
}
return true
}
func CreateFile(name string) error {
fo, err := os.Create(name)
if err != nil {
return err
}
defer func() {
fo.Close()
}()
return nil
}
Файл журнала создается, но ничего не печатается и не добавляется к нему. Зачем?
Ответы:
os.Open()
должно быть, в прошлом работало по-другому, но это работает для меня:На основе документации Go
os.Open()
не может работатьlog.SetOutput
, потому что открывает файл «для чтения»:РЕДАКТИРОВАТЬ
Перемещено
defer f.Close()
в послеif err != nil
проверкиисточник
f
может бытьnil
, что вызовет панику. Поэтомуerr
рекомендуется проверить, прежде чем откладывать вызов.Open
не работаетlog.SetOutput
?Я предпочитаю простоту и гибкость 12-факторной рекомендации приложения для ведения журнала. Чтобы добавить в файл журнала, вы можете использовать перенаправление оболочки. Регистратор по умолчанию в Go записывает в stderr (2).
См. Также: http://12factor.net/logs
источник
$ cd /etc/systemd/system
$ sudo vi app.service ExecStart=/bin/bash -c 'sudo go run main.go >> /home/ubuntu/go/src/html_menu_1/logfile'
меня НЕ работатьUbuntu 18.04.3
Я обычно распечатываю журналы на экране и записываю в файл. Надеюсь, это кому-то поможет.
источник
Это работает для меня
создал пакет под названием logger.go
импортируйте пакет туда, куда вы хотите войти, например, main.go
источник
Если вы запускаете двоичный файл на машине Linux, вы можете использовать сценарий оболочки.
перезаписать в файл
добавить в файл
перезаписать stderr в файл
добавить stderr в файл
он может быть более динамичным, используя файл сценария оболочки.
источник
Регистратор по умолчанию в Go записывает в stderr (2). перенаправить в файл
источник
Объявите наверху в своей глобальной системе,
var
чтобы все ваши процессы могли получить доступ при необходимости.источник
go version go1.10.2 windows/amd64
, какая у вас?outfile, _ = os.Create("my.log")
и он будет работать должным образом.outfile, _ = os.Create("./path/to/my.log")
. Почему-то я ожидал, что код создастpath/to
папки иmy.log
файл, но, видимо, это не сработало. Я предлагаю вам изменить свой ответ наoutfile, _ = os.Create("./my.log")
. Таким образом, мы четко знаем, что он создает журнал в текущей папке.Основываясь на ответе Эллисон и Дипака, я начал использовать logrus, и мне он очень понравился:
У меня есть defer f.Close () в основной функции
источник
Я пишу журналы в файлы, которые создаются ежедневно (в день создается один файл журнала). Этот подход отлично работает для меня:
Метод "corretenFilePath ()", используемый для получения имени файла из полного пути к файлу. и метод «LogServer ()» используется для создания отформатированного оператора журнала (содержит: имя файла, номер строки, уровень журнала, отчет об ошибке и т. д.)
источник
Чтобы помочь другим, я создаю базовую функцию журнала для обработки журнала в обоих случаях, если вы хотите, чтобы вывод выводился на стандартный вывод, затем включите отладку, это просто сделать флаг переключения, чтобы вы могли выбрать свой вывод.
источник
возможно, это поможет вам (если файл журнала существует, используйте его, если он не существует, создайте его):
Подробнее: https://su9.co/9BAE74B.
источник