Статьи

Подумайте по-другому о том, что войти Go

ThinkDiff_Image1Go — это молодой язык программирования, который только что отпраздновал свой шестой день рождения 10 ноября 2015 года. Даже продолжая испытывать естественные проблемы роста в молодости, Go уже зарекомендовал себя как надежный и все более популярный инструмент для создания небольших, эффективных масштабируемые микросервисы и множество других приложений. Его логотип — непритязательный суслик, легко узнаваемый символ, созданный Рене Френч из известной Plan9 1 . Выбор Go короткого общеанглийского слова для его названия делает его подходящим для каламбуров и расплывчатых поисков в Интернете, поэтому его обычно называют Golang, когда требуется конкретность.

Изучая и выходя из более известных предшественников программирования, таких как C, Prolog и Smalltalk (1972), C ++ (1983), Python (~ 1989), Java (1995) и Ruby (~ 1998), Go готов бросить вызов все и начать с нуля, где это выгодно. Это приводит к новым функциям и разочарованиям. Существует сильное чувство общности и четкий (и прогрессивный) подход к выполнению задач The Go Way . Стоит задуматься над идиоматическим стилем и инструментами Goобеспечить рабочий код, который соответствует установленным стандартам. Это действительно хорошо продуманный язык, который проверен в дикой природе, и его шаблоны заслуживают глубокого понимания. Да, и есть небольшая проблема родословной: Go — это проект Google, язык, разработанный и созданный для решения проблем их более чем немного успешной компании.

Создание полезного приложения включает в себя нечто большее, чем просто написание рабочего кода: чтобы успешно поддерживать работающую систему, мы должны дать себе и нашей команде обратную связь о том, что происходит, когда наш код запускается (и когда он перестает работать), в форме журналов.

ThinkDiff_Image2

Go имеет встроенную систему ведения журналов , и существует множество библиотек, которые борются за доминирование или хотя бы небольшую любовь. В этом сообщении мы обсудим, что вы должны регистрировать в своих программах Go, и ознакомимся с тем, как можно выполнить задачу.

Куда пойти журналирование встречает противоречие

Переходя от Go к другому основному языку программирования, разработчики могут искать знакомую почву в форме четности функций в библиотеке журналов. В последнее время среди членов сообщества Go обсуждались лучшие практики в этой области, и в основном приводились аргументы в пользу простоты, а не привычных или традиционных особенностей. Поскольку Go желает оторваться от стаи и сделать смелые шаги (вперед или назад, в зависимости от того, кого вы спрашиваете), многие из самых откровенных сторонников языка принимают и расширяют его индивидуальность. Не позволяйте этому отпугнуть вас! Существуют четкие, общепринятые стандарты того, как делать вещи в Go, но это также живой и дышащий инструмент, который вы можете создать самостоятельно. Независимо от того, является ли ваше решение примером идиоматического Go для учебников, или даже откровенным хаком, вы можете достичь своих целей с помощью небольшого исследования и творческого подхода. Используя существующую языковую функцию или библиотеку, создавая свою собственную или предлагая свои любимые функции, вы получаете всю мощь и гибкость в вашем распоряжении с Go.

ThinkDiff_Image3В то время как этот пост в блоге является катализатором процесса мышления, ничто не сравнится с непосредственным общением с другими разработчиками и сравнением заметок о том, как и почему мы делаем то, что делаем, вместе решая проблемы. Многие аспекты такого решения проблем являются концептуальными проблемами, превышающими используемый язык программирования. Не стесняйтесь расширять свой список чтения и разговоры, чтобы использовать сообщества, ресурсы и идеи, доступные на других языках!

Окружение и Конфигурация

Мы запускаем версию go1.5.1 darwin / amd64 для OSX El Capitan 10.11.1 на MacBook Air для разработки на локальном хосте и версию go1.5.1 linux / amd64 для Ubuntu 15.10 «Wily Werewolf» на DigitalOcean Droplet для производства. Go предназначен для работы на Mac, Unix, Linux, Windows и др. И имеет встроенные функции кросс-компиляции.

ThinkDiff_Image4

Golang Logging: Пример кода

Итак, давайте погрузимся в код! Вы можете загрузить копию нашего примера кода , расположенного на GitHub.com с `идут получить команду`:

> go get -u github.com/DavidLiedle/loggly-blog-go-logthis

(> Представляет вашу оболочку.) После запуска этой команды у вас есть рабочая копия проекта GitHub, скопированная в локальный рабочий каталог Go. Например, на нашем Mac разработки он загружается в ~ / go / src / github.com / DavidLiedle / loggly-blog-go-logthis, и его можно открывать, редактировать и использовать в качестве любого обычного хранилища git из этого места ,

Мы можем пойти еще дальше и «установить» основной сценарий, чтобы он мог запускаться как статически связанный двоичный исполняемый файл в командной строке из любой точки нашей системы:

> go install github.com/DavidLiedle/loggly-blog-go-logthis

Это создаст статически связанный исполняемый файл, называемый loggly-blog-go-loggly (да, он называет исполняемый файл именем проекта, независимо от того, каким может быть имя основного исполняемого файла в проекте; в нашем случае это файл называется logthis.go, и в нем указан основной пакет, указанный в коде). Это означает, что вы можете просто набрать `loggly-blog-go-logthis` (без обратных галочек) на своем терминале и, если ваша среда Go установлена ​​и настроена правильно, и у вас правильно настроены пути, пример кода будет работать! В нашей системе исполняемый файл помещается в ~ / go / bin и автоматически получает разрешение x для выполнения.

Код демонстрирует использование пакета glog от Google для регистрации. Go имеет свой собственный встроенный пакет логов, а также: https://golang.org/pkg/log/

Какие уровни вы должны войти в Go?

Мы регистрируем вещи, потому что нам нужна информация: вещи случаются, и мы хотим знать, что это за вещи. Иногда это то, что мы ожидали. Иногда это не так. Поскольку различные виды вещи случаются, мы хотим , чтобы иметь возможность классифицировать их по типу.

Дейв Чейни недавно написал статью, выражающую его взгляды на то, что должно (и не должно) регистрироваться: http://dave.cheney.net/2015/11/05/lets-talk-about-logging

Он утверждает, что успешные пакеты журналирования должны иметь меньше уровней журналирования и меньше функций в пользу более простой и эффективной коммуникации между разработчиком и читателем журналов из будущего.

С другой стороны, простота и ограниченные уровни ведения журнала уже доступны даже в сложных пакетах ведения журнала, которые пытаются отразить функции и уровни на других языках, поскольку разработчики могут ограничивать реализуемые ими функции и уровни.

Глобальный пакет Google предлагает многоуровневую регистрацию: INFO, WARNING, ERROR, FATAL

Это не относится к DEBUG, одному из двух основных уровней, рекомендованных в посте мистера Чейни. Библиотека glog от Google имеет собственную встроенную систему уровней с функцией V, которая позволяет вам настраивать то, что регистрируется. Как вы можете видеть в нашем примере кода, мы устанавливаем это в командной строке при запуске нашего кода: 

`go run logthis.go -logtostderr=true -v=2`

Го исключительно отличается

Go does not have exceptions, which can throw people off. It does have its own way of handling problems that arise in our code. If you want some more context, see why Dave Cheney thinks  Go gets exceptions right.

He compares the Go approach to C++, which holds the philosophy of “not-my-problem” in its handling of exceptions. Java added annotations to patch things up a bit, but the solution was still very broad and led to unclear code.

Rather than reaching for the comfortable, familiar throwing of exceptions found in C++, Java, and others, Go encourages the return of an error. Because Go has multi-value returns, you can get back the function return you’re looking for as well as the built-in error type. For example:

f, err := os.Open(“config.json”)

if err != nil {

   log.Fatal(err)

}

// do something with the open config *File f

This code snippet shows the use of the built-in Fatal() func of the log package. The Fatal functions call os.Exit(1) after execution, whereas the Panic functions call panic() after they run.

You don’t have to panic when something goes wrong in your code. Go’s pattern of returning and handling errors brings the responsibility back into your hands and avoids the confusion of throwing exceptions altogether.

Once you see log errors coming through, you’ll be alerted to areas of your code that need attention. In our short example above, we might see that the config.json file is missing and decide to add a message to our user instructing them in the configuration of that file.

There’s More to Logging than Levels

Although logging levels hold a large share of the conversation about Go logging, it’s important to keep other issues and other users in mind when designing your logging strategy. For example, you might need traces for debugging or performance metrics to find the bottlenecks that are slowing down your app. You might need to include user IDs for your customer support team, version numbers of split testing, environment names to facilitate log filtering, and more.

Ultimately, you and your team must decide on the data that you find useful to solve problems and track usage in your code. With unique challenges and strengths in the Go ecosystem, it’s worth having a round table discussion with your team to decide how you’ll address all of these considerations.

Getting Involved

ThinkDiff_Image5As an open source project and community, there are many opportunities to learn, discuss, and be heard. Go’s organizational structure and relatively simple syntax make it easy to “pop the hood” and see how things work, as well as extending functionality and implementing  new features and approaches to suit your needs.

You can view, edit, and share Go code snippets right in your browser: https://play.golang.org/p/euc9DDZUgQ

Join the IRC conversation in #go-nuts on freenode, or just view the discussion as an observer.

You may be interested in coming to Denver, Colorado for GopherCon 2016 in July.

Summary

We’ve examined the Go language’s position in the development community and how it fits in history, and discussed some of the surrounding factors which give perspective on Go’s approach to problem-solving. We’ve looked at an example of logging at the info level with Google’s glog package and shown how to use Go’s built-in logging package to log a fatal error which alerts us to give more attention to a config file’s handling in our code. With this perspective, we’ve looked at current and ongoing discussions regarding what we should log in our Go applications, and examined some example code putting it into practice. You’ve got the idea; now Go!