В этой статье мы сосредоточимся на пакете журнала в 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.