Pencatatan log yang sangat cepat, terstruktur, dan merata di Go.
go get -u go.uber.org/zap
Perhatikan bahwa zap hanya mendukung dua versi minor terbaru dari Go.
Dalam konteks di mana kinerjanya bagus, namun tidak kritis, gunakan SugaredLogger
. Ini 4-10x lebih cepat dibandingkan paket logging terstruktur lainnya dan mencakup API terstruktur dan bergaya 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 )
Ketika kinerja dan keamanan tipe sangat penting, gunakan Logger
. Ini bahkan lebih cepat daripada SugaredLogger
dan mengalokasikan jauh lebih sedikit, namun hanya mendukung logging terstruktur.
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 ),
)
Lihat dokumentasi dan FAQ untuk lebih jelasnya.
Untuk aplikasi yang masuk ke jalur hot, serialisasi berbasis refleksi dan pemformatan string sangatlah mahal — memerlukan banyak CPU dan menghasilkan banyak alokasi kecil. Dengan kata lain, menggunakan encoding/json
dan fmt.Fprintf
untuk mencatat banyak interface{}
membuat aplikasi Anda lambat.
Zap mengambil pendekatan yang berbeda. Ini mencakup encoder JSON yang bebas refleksi dan alokasi nol, dan Logger
dasar berupaya menghindari overhead dan alokasi serialisasi sedapat mungkin. Dengan membangun SugaredLogger
tingkat tinggi di atas fondasi tersebut, zap memungkinkan pengguna memilih kapan mereka perlu menghitung setiap alokasi dan kapan mereka lebih memilih API yang lebih familiar dan diketik secara longgar.
Seperti yang diukur oleh rangkaian pembandingannya sendiri, zap tidak hanya memiliki performa lebih baik dibandingkan paket logging terstruktur yang sebanding — tetapi juga lebih cepat dibandingkan pustaka standar. Seperti semua tolok ukur, ambillah ini dengan sebutir garam. 1
Catat pesan dan 10 bidang:
Kemasan | Waktu | Waktu% untuk zap | Objek yang Dialokasikan |
---|---|---|---|
⚡ zap | 656 ns/operasi | +0% | 5 alokasi/operasi |
⚡ zap (bergula) | 935 ns/operasi | +43% | 10 alokasi/operasi |
zerolog | 380 ns/operasi | -42% | 1 alokasi/operasi |
go-kit | 2249 ns/operasi | +243% | 57 alokasi/operasi |
bekerja keras (LogAttrs) | 2479 ns/operasi | +278% | 40 alokasi/operasi |
bekerja keras | 2481 ns/operasi | +278% | 42 alokasi/operasi |
puncak/log | 9591 ns/operasi | +1362% | 63 alokasi/operasi |
log15 | 11393 ns/operasi | +1637% | 75 alokasi/operasi |
logrus | 11654 ns/operasi | +1677% | 79 alokasi/operasi |
Catat pesan dengan logger yang sudah memiliki 10 bidang konteks:
Kemasan | Waktu | Waktu% untuk zap | Objek yang Dialokasikan |
---|---|---|---|
⚡ zap | 67 ns/operasi | +0% | 0 alokasi/operasi |
⚡ zap (bergula) | 84 ns/operasi | +25% | 1 alokasi/operasi |
zerolog | 35 ns/operasi | -48% | 0 alokasi/operasi |
bekerja keras | 193 ns/operasi | +188% | 0 alokasi/operasi |
bekerja keras (LogAttrs) | 200 ns/operasi | +199% | 0 alokasi/operasi |
go-kit | 2460 ns/operasi | +3572% | 56 alokasi/operasi |
log15 | 9038 ns/operasi | +13390% | 70 alokasi/operasi |
puncak/log | 9068 ns/operasi | +13434% | 53 alokasi/operasi |
logrus | 10521 ns/operasi | +15603% | 68 alokasi/operasi |
Catat string statis, tanpa konteks atau templat gaya printf
apa pun:
Kemasan | Waktu | Waktu% untuk zap | Objek yang Dialokasikan |
---|---|---|---|
⚡ zap | 63 ns/operasi | +0% | 0 alokasi/operasi |
⚡ zap (bergula) | 81 ns/operasi | +29% | 1 alokasi/operasi |
zerolog | 32 ns/operasi | -49% | 0 alokasi/operasi |
perpustakaan standar | 124 ns/operasi | +97% | 1 alokasi/operasi |
bekerja keras | 196 ns/operasi | +211% | 0 alokasi/operasi |
bekerja keras (LogAttrs) | 200 ns/operasi | +217% | 0 alokasi/operasi |
go-kit | 213 ns/operasi | +238% | 9 alokasi/operasi |
puncak/log | 771 ns/operasi | +1124% | 5 alokasi/operasi |
logrus | 1439 ns/op | +2184% | 23 alokasi/operasi |
log15 | 2069 ns/operasi | +3184% | 20 alokasi/operasi |
Semua API telah diselesaikan, dan tidak ada perubahan besar yang akan dilakukan pada seri rilis 1.x. Pengguna sistem manajemen ketergantungan yang sadar semver harus menyematkan zap ke ^1
.
Kami mendorong dan mendukung komunitas kontributor yang aktif dan sehat — termasuk Anda! Rinciannya ada di panduan kontribusi dan kode etik. Pengelola zap mengawasi masalah dan menarik permintaan, namun Anda juga dapat melaporkan perilaku negatif apa pun ke [email protected]. Daftar email itu adalah ruang pribadi dan aman; bahkan pengelola zap tidak memiliki akses, jadi jangan ragu untuk menetapkan standar tinggi pada kami.
Dirilis di bawah Lisensi MIT.
1 Secara khusus, perlu diingat bahwa kami mungkin melakukan benchmark terhadap versi paket lain yang sedikit lebih lama. Versi disematkan di file benchmarks/go.mod. ↩