Невероятно быстрое, структурированное и уровневое ведение журналов в Go.
go get -u go.uber.org/zap
Обратите внимание, что zap поддерживает только две последние второстепенные версии Go.
В контекстах, где производительность хорошая, но не критическая, используйте SugaredLogger
. Он в 4–10 раз быстрее, чем другие пакеты структурированного журналирования, и включает в себя как структурированные API, так и API-интерфейсы в стиле printf
.
logger , _ := zap . NewProduction ()
defer logger . Sync () // flushes buffer, if any
sugar := logger . Sugar ()
sugar . Infow ( "failed to fetch URL" ,
// Structured context as loosely typed key-value pairs.
"url" , url ,
"attempt" , 3 ,
"backoff" , time . Second ,
)
sugar . Infof ( "Failed to fetch URL: %s" , url )
Когда производительность и безопасность типов имеют решающее значение, используйте Logger
. Он даже быстрее, чем SugaredLogger
, и выделяет гораздо меньше памяти, но поддерживает только структурированное ведение журнала.
logger , _ := zap . NewProduction ()
defer logger . Sync ()
logger . Info ( "failed to fetch URL" ,
// Structured context as strongly typed Field values.
zap . String ( "url" , url ),
zap . Int ( "attempt" , 3 ),
zap . Duration ( "backoff" , time . Second ),
)
Дополнительную информацию см. в документации и часто задаваемых вопросах.
Для приложений, которые регистрируются по горячему пути, сериализация на основе отражения и форматирование строк являются непомерно дорогими — они нагружают процессор и требуют много небольших выделений. Иными словами, использование encoding/json
и fmt.Fprintf
для регистрации множества interface{}
замедляет работу вашего приложения.
Зап использует другой подход. Он включает в себя кодер JSON без отражений и с нулевым выделением ресурсов, а базовый Logger
стремится избежать накладных расходов на сериализацию и выделение ресурсов, где это возможно. Построив на этой основе высокоуровневый SugaredLogger
, zap позволяет пользователям выбирать, когда им нужно подсчитывать каждое выделение, а когда они предпочитают более знакомый, слабо типизированный API.
По данным собственного набора тестов, zap не только более производительен, чем сопоставимые пакеты структурированного журналирования, но и быстрее, чем стандартная библиотека. Как и все тесты, относитесь к ним с недоверием. 1
Зарегистрируйте сообщение и 10 полей:
Упаковка | Время | % времени на уничтожение | Выделенные объекты |
---|---|---|---|
⚡ зап | 656 нс/оп | +0% | 5 выделений/операция |
⚡ зап (засахаренный) | 935 нс/оп | +43% | 10 выделений/опер. |
нулевой журнал | 380 нс/оп | -42% | 1 выделение/операция |
готовый комплект | 2249 нс/оп | +243% | 57 выделений/опер. |
слог (LogAttrs) | 2479 нс/оп | +278% | 40 выделений/опер. |
изнурять | 2481 нс/оп | +278% | 42 выделения/операция |
вершина/бревно | 9591 нс/оп | +1362% | 63 выделения/операция |
журнал15 | 11393 нс/оп | +1637% | 75 выделений/опер. |
логрус | 11654 нс/оп | +1677% | 79 выделений/опер. |
Зарегистрируйте сообщение с помощью средства ведения журнала, у которого уже есть 10 полей контекста:
Упаковка | Время | % времени на уничтожение | Выделенные объекты |
---|---|---|---|
⚡ зап | 67 нс/оп | +0% | 0 выделений/операций |
⚡ зап (засахаренный) | 84 нс/оп | +25% | 1 выделение/операция |
нулевой журнал | 35 нс/оп | -48% | 0 выделений/операций |
изнурять | 193 нс/оп | +188% | 0 выделений/операций |
слог (LogAttrs) | 200 нс/оп | +199% | 0 выделений/операций |
готовый комплект | 2460 нс/оп | +3572% | 56 выделений/опер. |
журнал15 | 9038 нс/оп | +13390% | 70 выделений/опер. |
вершина/бревно | 9068 нс/оп | +13434% | 53 выделения/операция |
логрус | 10521 нс/оп | +15603% | 68 выделений/опер. |
Зарегистрируйте статическую строку без какого-либо контекста или шаблонов в стиле printf
:
Упаковка | Время | % времени на уничтожение | Выделенные объекты |
---|---|---|---|
⚡ зап | 63 нс/оп | +0% | 0 выделений/операций |
⚡ зап (засахаренный) | 81 нс/оп | +29% | 1 выделение/операция |
нулевой журнал | 32 нс/оп | -49% | 0 выделений/операций |
стандартная библиотека | 124 нс/оп | +97% | 1 выделение/операция |
изнурять | 196 нс/оп | +211% | 0 выделений/операций |
слог (LogAttrs) | 200 нс/оп | +217% | 0 выделений/операций |
готовый комплект | 213 нс/оп | +238% | 9 выделений/опер. |
вершина/бревно | 771 нс/оп | +1124% | 5 выделений/операция |
логрус | 1439 нс/оп | +2184% | 23 выделения/операция |
журнал15 | 2069 нс/оп | +3184% | 20 выделений/опер. |
Все API окончательно доработаны, и в серии выпусков 1.x не будет внесено никаких кардинальных изменений. Пользователи систем управления зависимостями, поддерживающих semver, должны прикрепить zap к ^1
.
Мы поощряем и поддерживаем активное, здоровое сообщество участников, включая вас! Подробности приведены в руководстве по вкладам и кодексе поведения. Сопровождающие zap следят за проблемами и запросами на включение, но вы также можете сообщить о любом негативном поведении по адресу [email protected]. Этот список адресов электронной почты является частным и безопасным местом; даже у сопровождающих zap нет доступа, поэтому не стесняйтесь требовать от нас высоких стандартов.
Выпущено по лицензии MIT.
1 В частности, имейте в виду, что мы можем проводить сравнение с немного более старыми версиями других пакетов. Версии закреплены в файле тестов/go.mod. ↩