В этой статье мы сосредоточимся на пакете журнала в Golang. Этот пакет реализует простые структуры, методы и функции для регистрации информации о времени выполнения программы. Но сначала нам нужно понять, почему не следует использовать пакет «fmt»:

  • Пакет log одновременно защищен от горутин, а пакет fmt — нет.
  • Пакет журнала может автоматически прикреплять информацию о времени, дате, пути к файлу и т. д.

Первый пункт означает, что если вы используете пакет fmt в нескольких процессах, сообщение может появиться не так, как ожидалось.

Давайте начнем с написания простого сообщения журнала:

package main

import "log"

func main() {
 log.Println("test log")
}

Это показывает, как простое сообщение может отображаться в Go. Мы также можем установить флаги того, какие флаги журнала должны быть прикреплены к сообщению:

package main

import "log"

func main() {
 log.SetFlags(log.Ldate | log.Lshortfile)
 log.Println("test log")
}

Это будет отображать только дату вместе с именем файла.

Мы также можем вызвать функцию panic через этот пакет:

package main

import "log"

func main() {
 //log.SetFlags(log.Ldate | log.Lshortfile)
 //log.Println("test log")
 log.Panic("Panicing")
}

Это даст следующий результат:

Если мы хотим, чтобы программа завершилась в случае ошибки, мы делаем что-то вроде этого,

package main

import "log"

func main() {
 //log.SetFlags(log.Ldate | log.Lshortfile)
 //log.Println("test log")
 //log.Panic("Panicing")
 log.Fatal("fatal...")
}

Это даст следующий результат:

Обычно мы регистрируем эти сообщения в файле:

package main

import (
 "log"
 "os"
)

func main() {
 //log.SetFlags(log.Ldate | log.Lshortfile)
 //log.Println("test log")
 //log.Panic("Panicing")
 //log.Fatal("fatal...")
 file, _ := os.Create("file.log")
 log.SetOutput(file)
 log.Println("hello world")
 file.Close()
}

Это ничего не напечатает на терминале, вместо этого он выдаст свой вывод в файл:

Вы можете наблюдать файл ниже:

Есть несколько общих журналов, которые мы обычно используем:

package main

import (
 "log"
 "os"
)

func main() {
 //log.SetFlags(log.Ldate | log.Lshortfile)
 //log.Println("test log")
 //log.Panic("Panicing")
 //log.Fatal("fatal...")
 //file, _ := os.Create("file.log")
 //log.SetOutput(file)
 //log.Println("hello world")
 //file.Close()

 flags := log.Ldate | log.Lshortfile
 infoLogger := log.New(os.Stdout, "INFO: ", flags)
 warnLogger := log.New(os.Stdout, "WARN: ", flags)
 errorLogger := log.New(os.Stdout, "ERROR: ", flags)
 infoLogger.Println("This is an info log")
 warnLogger.Println("This is an warning log")
 errorLogger.Println("This is an error log")
}

Это даст следующий результат:

Мы также можем создать агрегированные логгеры, которые мы обсудим в какой-нибудь другой статье, так что это было о логировании в Go.