Günlük kaydı, yazılım geliştirme döngüsünde gelecekteki amaçlar için kayıt tutma tekniğidir. Günlükler hata ayıklama, tanılama, sorun giderme ve proje izleme konularında yardımcı olduğu için günlük kaydı önemlidir.
Hatalar, uyarılar, hata ayıklama ve daha fazlası için uygulamalarınızın çeşitli düzeylerinde günlüğe kaydetmeyi kullanabilirsiniz.
Giriş Yap
Go standart kitaplığı , işlevsellik açısından zengin bir günlük paketi içerir. Uygulamanız için ihtiyaç duyacağınız çeşitli günlük kaydı düzeylerini ve günlük kaydıyla ilgili temel yöntemleri yönetir. Ancak, uygulamanız karmaşıksa ve üretkenliğe öncelik vermek istiyorsanız günlük paketi en iyi seçenek olmayabilir.
Günlük paketi, yapılandırılmış günlükler için işlevsellik sağlamaz. Yapılandırılmış günlüğe kaydetme paketleri, günlüğe kaydetme sürecini basitleştiren ve iyileştiren işlevsellik sağlar. Go ekosistemi, bu tür birçok pakete ev sahipliği yapmaktadır.
1. Uber tarafından Zap
Zap, Uber’in açık kaynak ekibi tarafından Go’da günlük yazmak için oluşturulmuş hızlı, yapılandırılmış, seviyelendirilmiş bir günlük paketidir. Uber, Zap paketini, günlük paketi de dahil olmak üzere Go ekosistemindeki diğer paketlerden daha performanslı günlük kaydı sağlamak için oluşturdu .
Zap paketinde iki farklı kaydedici vardır. Kaydedici işlevi, kritik performans durumlarını işler . SugaredLogger , printf tarzı API’si ile daha fazla esneklik sunar, ancak performansta küçük bir ödünleşim ile birlikte gelir . Daha yavaş SugaredLogger paketi bile diğer yapılandırılmış günlük paketlerinden 4-10 kat daha hızlıdır.
Zap paketini kurmak için komut satırında aşağıdakileri çalıştırın:
go get -u go.uber.org/zap
Zap paketinin işlevselliğini başarılı bir şekilde kurmak ve kullanmak için Go’nun yeni bir sürümüne ihtiyacınız olacak.
logger, err := zap.NewProduction() // zap logger instance
if err != nil {
fmt.Println(err.Error())
}
defer logger.Sync() // flushes buffers, if any
sugar := logger.Sugar() //sugared logger here
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) // using the printf style formatter
Günlükçü değişkeni, zap günlükçüsünün bir örneğidir ve Sugar yöntemi , şekerli bir günlükçü örneğidir.
Infow yöntemi çıktıya yazar ve Infof , Infow yönteminin biçimlendirme sürümüdür .
2. Logrus Paketi
Logrus , Go uygulamaları için yapılandırılmış bir günlük kaydı paketidir. Logrus, benzer işlevselliğe sahip standart kütüphane kaydedici ile uyumludur. Günlük paketini kullanma deneyiminiz varsa , Logrus ile çalışan bir paket bulacaksınız.
Logrus, varsayılan olarak JSON biçimlendirmesini desteklemez. Ancak her zaman yerleşik json paketi gibi bir JSON kitaplığını Logrus’ SetFormatter yöntemiyle kullanabilirsiniz.
Logrus, farklı seviyelerde günlüğe kaydetmeyi destekler ve çoğu günlüğe kaydetme paketi kadar performanslı olmasa da, zengin özelliklere sahip ve güvenlidir.
Logrus’u çalışma dizininize kurmak için bu komutu kullanabilirsiniz:
go get github.com/sirupsen/logrus
İşte Logrus paketiyle günlüğe kaydetmeye bir örnek.
import (
“os”
log “github.com/sirupsen/logrus” // alias import
)
func main {
log.SetFormatter(&log.JSONFormatter{}) // set formatter to JSON
log.SetOutput(os.Stdout) // output to standard output
log.SetLevel(log.WarnLevel) // set warning level
log.WithFields(log.Fields{
“Name”: “John Doe”,
“Age”: 40,
}).Info(“John’s Bio Data”)
}
Bu kod, Logrus kitaplığını içe aktarır ve bunun için log adında bir takma ad oluşturur . Ana işlevde, günlükler için bir biçimlendirici ayarlamak için SetFormatter yöntemini çağırır . Günlük iletilerinin nereye gitmesi gerektiğini belirlemek için SetOutput yöntemini kullanabilirsiniz; bu durumda, standart çıktı.
SetLevel yöntemi, belirtilen düzeydeki veya üzerindeki uyarıları günlüğe kaydeder .
3. ZeroLog Paketi
ZeroLog , performans için tasarlanmış, günlük kaydı için Zap’ten ilham alan, hızlı, JSON’a özel bir kitaplıktır. Zerolog’un JSON yazmasına ve olayları ayırma ve yansıma olmadan kaydetmesine izin veren benzersiz bir zincirleme API kullanır.
Zerolog, kod tabanını ve API’yi basit tutarken kullanımı daha kolay bir API ve daha yüksek performans sağlamayı amaçlamaktadır. Yapılandırılmış günlüğe kaydetmeye odaklanır ve konsolunuzda güzel günlüğe kaydetme için ConsoleWriter yöntemini kullanabilirsiniz.
Zerolog paketinde isteğe bağlı yığın izleme özellikleriyle düşük ayırma, seviyeli günlük kaydı, örnekleme, kancalar, bağlamsal alanlar ve hata günlüğü vardır. Zerolog’u bağlam ve http paketleriyle de entegre edebilirsiniz.
Zerolog paketini kurmak için çalışma alanınızın terminalinde bu komutu çalıştırın .
go get -u [github.com/rs/zerolog/log](http://github.com/rs/zerolog/log)
İşte basit bir işlem için Zerolog paketini kullanmanın basit bir örneği.
import (
“github.com/rs/zerolog” // zerolog for configs
“github.com/rs/zerolog/log” // log for logging
)
func main() {
// UNIX Time is faster and smaller than most timestamps
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
log.Print(“hello world”)
}
TimeFieldFormat seçeneği, Unix saat biçimine ayarlanır ve Yazdır komutu , metin bağımsız değişkenini standart çıktıya yazar.
4. Log15 Paketi
log15-github-preview-photo-1
Log15 paketi , Go’daki en iyi uygulamalarla insan ve makine tarafından okunabilen günlük kaydı için basit bir fikirli araç takımıdır. Log15 , yerleşik günlük paketine alternatif olarak Go standart kitaplığından io ve http paketlerini modeller.
Log15 paketinin özellikleri şunları içerir:
- basit, anlaşılması kolay bir API
- anahtar/değer çiftleriyle yapılandırılmış günlük kaydı
- özel bağlamlı alt kaydediciler
- küçük bir API üzerinden özel günlük yapılandırmaları oluşturmak için işleyici arabirimi
- renkli terminal desteği
- dosyalara, akışlara, sistem günlüklerine ve ağ günlüklerine giriş yapmak için yerleşik destek
- çıktı için kayıtların arabelleğe alınması.
- Bu komut ile Log15’i Go paketlerinize kurabilirsiniz .
go get github.com/inconshreveable/log15
Log15 paketini kullanmaya başlamak kolaydır. İşte bir günlükçü başlatma ve paketle bilgi ve hata seviyelerinde oturum açma örneği.
import (
log “github.com/inconshreveable/log15” // alias import as log
)
func main() {
serverLog := log.New(“repository”, “new repository”) // instantiating logger
serverLog.Info(“repository layer health check successful”) // info log
serverLog.Error(“repository layer health check failed”) // error log
}
serverLog değişkeni, Log15 günlükçüsünün bir örneğidir; Yeni yöntem , sağladığınız bağlam bağımsız değişkenleriyle bir günlükçü döndürür.
Info yöntemi bir bilgi mesajı döndürür ve Error yöntemi bir hata mesajı verir.
Faydalı ve Anlaşılır Günlükler Yazın
Günlüğe kaydetme, geliştirme sürecinin diğer herhangi bir parçası kadar kritik olabilir. İlk aşamalarda çok kolay görünebilir, ancak temel uygulamalara bağlı kalmak süreci zorlaştırabilir. Günlüğe kaydetmenin her uç durumunu ve yönünü ele almak için, işleri kolaylaştırmak için bir günlük paketi kullanmalısınız.
Günlüklerinizi anlaşılır ve amaçlarına uygun hale getirmek için günlük düzeylerini, yapısını ve bağlamını kullanın.