В вычислительной парадигме файл журнала — это файл, в котором записываются либо события, происходящие в операционной системе или другом программном обеспечении, либо сообщения между различными пользователями коммуникационного программного обеспечения. Ведение журнала — это акт ведения журнала. В простейшем случае сообщения записываются в один файл журнала.
Журнал Golang
Журнал пакета в Golang реализует простой пакет регистрации. Он определяет тип Logger с методами форматирования вывода. Журнал Golang будет полезен в критических сценариях в приложениях реального времени.
Он также имеет предопределенный «стандартный» журнал, доступный через вспомогательные функции Print [f | ln], Fatal [f | ln] и Panic [f | ln], которые проще в использовании, чем создание регистратора вручную.
Golang предоставляет вам множество вариантов при выборе пакета ведения журнала , и мы рассмотрим некоторые из них ниже.
Крупные корпорации, которые зависят от распределенных систем, часто пишут свои приложения в Go, чтобы воспользоваться преимуществами функций параллелизма, таких как каналы и горутины (например, Heroku , Basecamp ).
Если вы отвечаете за создание или поддержку приложений Go, хорошо продуманная стратегия ведения журнала может помочь вам понять поведение пользователей, локализовать ошибки и контролировать производительность ваших приложений.
Как использовать журнал в Голанге
Golang имеет встроенную библиотеку ведения журнала, которая называется log , поставляется с регистратором по умолчанию, который записывает стандартную ошибку и добавляет метку времени без необходимости настройки.
Вы можете использовать эти готовые журналы для локальной разработки, когда вам нужно быстро получить обратную связь от вашего кода, что может быть более важным, чем создание подробных структурированных журналов.
Если вы хотите создавать подробные и структурированные журналы, вам будут более полезны сторонние пакеты.
Например , вы можете определить функцию деления, которая возвращает ошибку вызывающей стороне вместо выхода из программы, когда вы пытаетесь разделить на ноль.
См. следующий код.
//hello.gopackage mainimport ("errors" "fmt" "log") func деление (x float32, y float32) (float32, error) {if y == 0 {return 0, errors.New ("не может делиться на ноль ")} return x/y, nil} func main () {var x float32 = 11var y float32res, err: = division (x, y) if err! = nil {log.Print (err)} fmt.Println (res)}
Вывод
➜ hello go run hello.go2019/11/28 18:50:19 can ' t делить на ноль 0➜ привет
В приведенной выше программе мы импортировали три пакета .
- errors
- fmt
- log
Затем мы определили функцию Division (), которая принимает два параметра.
Мы проверяем ошибку деления на 0, и если она возникает, то записываем эту ошибку в консоль..
Если мы встретили условие деления на 0, то будет сгенерирована одна ошибка, и затем мы записываем эту ошибку в консоль, а также выводим возвращаемое значение в консоль.
В приведенной выше программе мы получили условие деления на 0; именно поэтому мы получили журнал вывода.
Регистратор записывает стандартную ошибку и печатает дату и время каждого зарегистрированного сообщения, что очень полезно в целом case-сценарии.
Каждое сообщение журнала выводится в отдельной строке: если печатаемое сообщение не заканчивается на новой строке, регистратор добавит одну строку.
Неустранимые функции вызывают os.Exit (1) после записи сообщения журнала.
Функции паники вызывают панику после записи сообщения журнала.
Как сохранить зарегистрированные сообщения в файлах в Go
В приведенном выше коде мы напечатали сообщение журнала в консоли. Давайте сохраним сообщение в файле, потому что в приложении реального времени все журналы сохраняются в файле.
См. Следующий код.
// hello.gopackage mainimport ("errors" "fmt" "log" "os") func Division (x float32, y float32) (float32, error) {if y == 0 {return 0, errors.New ("cannot разделить на ноль ")} return x/y, nil} func main () {var x float32 = 11var y float32res, исключение: = файл деления (x, y), err: = os.OpenFile (" info.log ", os.O_CREATE | os.O_APPEND | os.O_WRONLY, 0644) if err! = nil {log.Fatal (err)} defer file.Close () log.SetOutput (file) log.Print (исключение) fmt.Println (res )}
Вывод
➜ hello go run hello.go0➜ hello
Кроме того, вы найдете info.log , созданный в вашем каталоге. Откройте файл, и вы увидите что-то вроде следующего напечатанного.
2019/11/28 19:29:33 не может делиться на ноль
Операционная система Интерфейс в Go должен быть единообразным для всех операционных систем. Функции, которые обычно недоступны, появляются в системном вызове пакета.
Если открыть файл не удается, то строка ошибки не требует пояснений.
Что мы в приведенном выше коде заключается в том, что мы создаем один файл журнала и печатаем наше сообщение журнала внутри этого файла.
После печати сообщения журнала мы закрываем файл, и все.
Пакет Github logrus для форматированных журналов
Logrus, пакет ведения журнала, разработанный для структурированного ведения журнала, который хорошо подходит для входа в систему JSON. Формат JSON позволяет машинам быстро анализировать журналы Golang.
А поскольку JSON является четко определенным стандартом, он упрощает добавление контекста путем включения новых полей — синтаксический анализатор должен иметь возможность получать их автоматически.
Используя пакет logrus, вы можете определить стандартные поля для добавления в журналы JSON с помощью функции WithFields, как показано ниже.
Затем вы можете выполнять вызовы регистратора на разных уровнях, таких как Info (), Warn () и Error ()..
Библиотека logrus автоматически запишет журнал как JSON и вставит стандартные поля вместе с любыми полями, которые вы определили на лету.
go get github.com/Sirupsen/logrus
Теперь вы можете импортировать пакет в свой файл. См. Следующий код.
//hello.gopackage mainimport (log "github.com/sirupsen/logrus")func main () {log.WithFields (log.Fields {" Лучшая песня ": "Подсолнух",}). Info ("Одна из лучших песен")}
Вывод
Обратите внимание, что он полностью совместим с api с регистратором stdlib, так что вы можете замените везде импортированные журналы на журнал «github.com/sirupsen/logrus», и теперь у вас будет гибкость Logrus. Вы можете настроить все, что хотите:
//hello.gopackage mainimport ("os" log "github.com/sirupsen/logrus")func init () {//Регистрируемся как JSON вместо стандартный формат ASCII .log.SetFormatter (& log.JSONFormatter {})//Вывод на стандартный вывод вместо стандартного stderr//Может быть любым io.Writer, см. ниже файл examplelog.SetOutput (os.Stdout)//Только журнал серьезность предупреждения или выше. log.SetLevel (log.WarnLevel)} func main () {log.WithFields (log.Fields {"animal": "морж", "size": 10,}). Info ("Группа моржа выходит из океана ") log.WithFields (log.Fields {" omg ": true," number ": 122,}). Warn (" Численность группы сильно увеличилась! ") log.WithFields (log.Fields { "omg": true, "number": 100,}). Fatal ("Лед тронулся!")//Распространенным шаблоном является повторное использование полей между операторами регистрации путем повторного использования//logrus.Entry, возвращенного из WithFields () contextLogger: = log.WithFields (log.Fields {"common": "это обычное поле", "other": "Я также должен всегда регистрироваться",}) contextLogger.Info ("Я буду зарегистрированный остроумие h общее и другое поле ") contextLogger.Info (" Я тоже ")}
Вывод
➜ привет, давай, беги, привет .go {"level": "warning", "msg": "Количество группы сильно увеличилось!", "number": 122, "omg": true, "time": "2019-11-28T19: 44: 30 +05: 30 "} {" level ":" фатальный "," msg ":" Лед тронулся! "," Number ": 100," omg ": true," time ":" 2019-11-28T19: 44 : 30 + 05: 30 "} статус выхода 1➜ привет
Рекомендации по написанию и хранению журналов Golang
Первый Дело при написании журнала — найти идеальную библиотеку. Затем, после того, как вы выбрали библиотеку ведения журнала, вы также захотите спланировать, где в вашем коде выполнять вызовы регистратора, как хранить журналы и как сделать их доступными в любой момент времени и как их анализировать. .
Давайте посмотрим на некоторые из лучших практик.
- Вы можете выполнять вызовы регистратора из основного процесса приложения, а не из горутин.
- Если вы пишете журналы, считается хорошей практикой. из вашего приложения в локальный файл, даже если вы позже отправите их на центральную платформу.
- Вы можете стандартизировать свои журналы с помощью набора предопределенных сообщений.
- Вы можете отправлять свои журналы на центральную платформу, чтобы вы могли их анализировать и агрегировать.
- Используйте заголовки HTTP и уникальные идентификаторы для регистрации поведения пользователей в микросервисах.
Заключение
В этом посте мы рассмотрели преимущества и недостатки нескольких библиотек ведения журналов Go.
Мы также рекомендовали способы обеспечения того, чтобы ваши журналы были доступны и доступны, когда они вам нужны, а информация, которую они содержат, удобна, согласована и проста для анализа.
Наконец, статья в журнале Golang окончена.
Рекомендуемые сообщения
Шаблоны Golang
Golang Карты
Структуры Golang
Интерфейс Golang
Функция приемника Golang