Ответ
Стандартный пакет log
в Go предоставляет базовый, но надежный функционал для логирования, который подходит для простых приложений и скриптов.
Плюсы:
- Простота и доступность: Встроен в стандартную библиотеку, не требует установки сторонних зависимостей.
- Легкость использования: Базовое логирование выполняется одной строкой:
log.Println("сообщение")
. - Потокобезопасность: Все вызовы функций пакета
log
потокобезопасны, что избавляет от необходимости использовать мьютексы для защиты вывода. - Базовая настройка: Позволяет настраивать префикс, формат вывода (дата, время, файл) через
log.SetFlags()
и перенаправлять вывод в любойio.Writer
(файл, буфер и т.д.) черезlog.SetOutput()
.
Минусы:
- Отсутствие уровней логирования: Нет встроенной поддержки уровней
DEBUG
,INFO
,WARN
,ERROR
. Все сообщения имеют одинаковый приоритет. - Только текстовый формат: Не поддерживает структурированное логирование (например, в JSON), что затрудняет автоматизированный парсинг и анализ логов системами вроде ELK или Splunk.
- Ограниченное форматирование: Возможности кастомизации вывода ограничены флагами.
- Отсутствие ротации логов: Нет встроенных механизмов для управления файлами логов (ротация по размеру или времени).
Пример использования:
import (
"log"
"os"
)
func main() {
// Настройка логгера для вывода даты, времени и файла с номером строки
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
log.Println("Сервер запускается...")
// Пример вывода: 2023/10/26 14:30:00 main.go:12: Сервер запускается...
// Можно перенаправить вывод в файл
file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Fatal("Не удалось открыть файл лога")
}
defer file.Close()
log.SetOutput(file)
log.Println("Это сообщение будет записано в файл.")
}