Логирование программ Go
Логирование программ Golang
Журнал пакетов стандартной библиотеки предоставляет базовую инфраструктуру для управления логами на языке GO. Основная цель ведения логов — отследить, что происходит в программе, где это происходит и когда это происходит. Логи могут обеспечивать отслеживание кода, профилирование и аналитику. Ведение журнала логирования( глаза и уши программиста) — это способ найти эти ошибки и узнать больше о том, как работает программа.
Для работы с журналом логов мы должны импортировать модуль Log:
import (
"log"
)
В самом простом случае модуль Log формирует сообщения и отправляет их на стандартную проверку ошибок, как показано в следующем примере:
// Program in GO language to demonstrates how to use base log package.
package main
import (
"log"
)
func init(){
log.SetPrefix("LOG: ")
log.SetFlags(log.Ldate | log.Lmicroseconds | log.Llongfile)
log.Println("init started")
}
func main() {
// Println writes to the standard logger.
log.Println("main started")
// Fatalln is Println() followed by a call to os.Exit(1)
log.Fatalln("fatal message")
// Panicln is Println() followed by a call to panic()
log.Panicln("panic message")
}
После выполнения этого кода вывод будет выглядеть так:
LOG: 2017/06/25 14:49:41.989813 C:/golang/example38.go:11: init started
LOG: 2017/06/25 14:49:41.990813 C:/golang/example38.go:15: main started
LOG: 2017/06/25 14:49:41.990813 C:/golang/example38.go:18: fatal message
exit status 1
Стандартная запись логов содержит следующую информцию: - префикс (log.SetPrefix("LOG: ")) - отметка даты и времени (log.Ldate) - полный путь к файлу исходного кода записи в лог (log.Llongfile) - строка кода Эта часть информации автоматически генерируется для нас, информация о том, когда произошло событие, и информация о том, где оно произошло. Println — это стандартный способ записи сообщений журнала. Fatalln - библиотека выводит сообщение об ошибке, а затем вызывает os.Exit(1), заставляя программу завершить работу. Panic — это встроенная функция, которая останавливает обычный поток управления и начинает паниковать. Когда функция F вызывает panic, выполнение F останавливается, все отложенные вызовы в F выполняются нормально, затем F возвращает управление вызывающей функции. Для вызывающей функции вызов F ведёт себя как вызов panic. Процесс продолжается вверх по стеку, пока все функции в текущей го-процедуре не завершат выполнение, после чего аварийно останавливается программа. Паника может быть вызвана прямым вызовом panic, а также вследствие ошибок времени выполнения, таких как доступ вне границ массива.
Программа на языке GO с реальным примером ведения журнала логов. Теперь приведем пример из реального мира и реализуем вышеуказанный пакет log в своей программе. Проверим, нормально ли работает SMTP-соединение. Для тестового примера я собираюсь подключиться к несуществующему SMTP-серверу smtp.smail.com, поэтому программа завершится с сообщением ошибки.
// Program in GO language with real world example of logging.
package main
import (
"log"
"net/smtp"
)
func init(){
log.SetPrefix("TRACE: ")
log.SetFlags(log.Ldate | log.Lmicroseconds | log.Llongfile)
log.Println("init started")
}
func main() {
// Connect to the remote SMTP server.
client, err := smtp.Dial("smtp.smail.com:25")
if err != nil {
log.Fatalln(err)
}
client.Data()
}
Вывод:
TRACE: 2017/06/25 14:54:42.662011 C:/golang/example39.go:9: init started
TRACE: 2017/06/25 14:55:03.685213 C:/golang/example39.go:15: dial tcp 23.27.98.252:25: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
exit status 1
еще пример:
package main
import (
"log"
"os"
)
var (
WarningLogger *log.Logger
InfoLogger *log.Logger
ErrorLogger *log.Logger
)
func init() {
file, err := os.OpenFile("logs.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
log.Fatal(err)
}
InfoLogger = log.New(file, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile)
WarningLogger = log.New(file, "WARNING: ", log.Ldate|log.Ltime|log.Lshortfile)
ErrorLogger = log.New(file, "ERROR: ", log.Ldate|log.Ltime|log.Lshortfile)
}
func main() {
InfoLogger.Println("Starting the application...")
InfoLogger.Println("Something noteworthy happened")
WarningLogger.Println("There is something you should know about")
ErrorLogger.Println("Something went wrong")
}
+1
+1
3
+1
+1
+1