Go'da oturum açmayı öğrenin

Tamamlandı

Günlükler bir programda önemli bir rol oynar çünkü bir sorun olduğunda denetleyebileceğiniz bir bilgi kaynağı haline gelirler. Genellikle, bir hata oluştuğunda, son kullanıcılar yalnızca programla ilgili bir sorun olduğunu belirten bir ileti görür. Geliştirici açısından bakıldığında, basit bir hata iletisinden daha fazla bilgiye ihtiyacımız var. Bunun asıl nedeni, düzgün bir düzeltme yazmak için sorunu yeniden oluşturmak istememizdir. Bu modülde Go'da günlüğe kaydetmenin nasıl çalıştığını öğreneceksiniz. Ayrıca her zaman uygulamanız gereken birkaç uygulamayı da öğreneceksiniz.

log paketi

Yeni başlayanlar için Go, günlüklerle çalışmaya yönelik basit bir standart paket sunar. Bunu, paketi nasıl kullandığınıza benzer bir şekilde kullanabilirsiniz fmt . Standart paket günlük düzeyleri sağlamaz ve her paket için ayrı günlükçüler yapılandırmanıza izin vermez. Daha karmaşık günlük yapılandırmaları yazmanız gerekiyorsa, bunu bir günlük çerçevesi kullanarak yapabilirsiniz. Günlüğe kaydetme çerçevelerini daha sonra ele alacağız.

Günlükleri kullanmanın en kolay yolu aşağıdadır:

import (
    "log"
)

func main() {
    log.Print("Hey, I'm a log!")
}

Önceki kodu çalıştırdığınızda şu çıkışı alırsınız:

2020/12/19 13:39:17 Hey, I'm a log!

Varsayılan olarak işlev, log.Print() günlük iletisinin ön eki olarak tarih ve saati içerir. kullanarak fmt.Print()da aynı davranışı elde edebilirsiniz, ancak günlükleri bir dosyaya log göndermek gibi başka işlemler de yapabilirsiniz. Daha sonra daha fazla log paket işlevine bakacağız.

bir hatayı günlüğe kaydetmek ve kullanmış gibi programı sonlandırmak için işlevini kullanabilirsiniz log.Fatal() os.Exit(1). Denemek için şu kod parçacığını kullanalım:

package main

import (
    "fmt"
    "log"
)

func main() {
    log.Fatal("Hey, I'm an error log!")
    fmt.Print("Can you see me?")
}

Önceki kodu çalıştırdığınızda şu çıkışı alırsınız:

2020/12/19 13:53:19  Hey, I'm an error log!
exit status 1

Son satırın fmt.Print("Can you see me?")nasıl çalışmadığı dikkat edin. Bunun nedeni, işlev çağrısının log.Fatal() programı durdurmasıdır. İşlevi log.Panic() de çağıran panic() işlevini kullandığınızda benzer davranışlar elde edersiniz, örneğin:

package main

import (
    "fmt"
    "log"
)

func main() {
    log.Panic("Hey, I'm an error log!")
    fmt.Print("Can you see me?")
}

Önceki kodu çalıştırdığınızda şu çıkışı alırsınız:

2020/12/19 13:53:19  Hey, I'm an error log!
panic: Hey, I'm an error log!

goroutine 1 [running]:
log.Panic(0xc000060f58, 0x1, 0x1)
        /usr/local/Cellar/go/1.15.5/libexec/src/log/log.go:351 +0xae
main.main()
        /Users/christian/go/src/helloworld/logs.go:9 +0x65
exit status 2

Günlük iletisini almaya devam edersiniz, ancak şimdi hata yığını izlemesini de alırsınız.

Bir diğer temel işlev de ' dir log.SetPrefix(). Bunu kullanarak programınızın günlük iletilerine bir ön ek ekleyebilirsiniz. Örneğin, şu kod parçacığını kullanabilirsiniz:

package main

import (
    "log"
)

func main() {
    log.SetPrefix("main(): ")
    log.Print("Hey, I'm a log!")
    log.Fatal("Hey, I'm an error log!")
}

Önceki kodu çalıştırdığınızda şu çıkışı alırsınız:

main(): 2021/01/05 13:59:58 Hey, I'm a log!
main(): 2021/01/05 13:59:58 Hey, I'm an error log!
exit status 1

Ön eki bir kez ayarlarsanız günlükleriniz günlüğün geldiği işlevin adı gibi bilgileri içerir.

Go web sitesinde diğer işlevleri keşfedebilirsiniz.

Dosyaya günlük kaydı yapma

Günlükleri konsola yazdırmanın yanı sıra, günlükleri daha sonra veya gerçek zamanlı olarak işleyebilmek için bir dosyaya göndermek isteyebilirsiniz.

Neden bir dosyaya günlük göndermek istiyorsunuz? İlk olarak, son kullanıcılarınızdan belirli bilgileri gizlemek isteyebilirsiniz. Onlar ilgilenmeyebilir veya hassas bilgileri açığa çıkartıyor olabilirsiniz. Dosyalarda günlükleriniz olduğunda, tüm günlükleri tek bir konumda merkezileştirebilir ve bunları diğer olaylarla ilişkilendirebilirsiniz. Bu desen tipiktir: kapsayıcılar gibi kısa ömürlü olabilecek dağıtılmış uygulamalara sahip olmak.

Bir dosyaya günlük göndermeyi test etmek için aşağıdaki kodu kullanalım:

package main

import (
    "log"
    "os"
)

func main() {
    file, 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("Hey, I'm a log!")
}

Yukarıdaki kodu çalıştırdığınızda konsolda hiçbir şey görmezsiniz. Dizininizde, işlevini kullanarak log.Print() gönderdiğiniz günlükleri içeren info.log adlı yeni bir dosya görmeniz gerekir. Bir dosya oluşturarak veya açarak ve ardından paketi tüm çıkışı bir dosyaya gönderecek şekilde yapılandırarak log başlamanız gerektiğini fark edin. Daha sonra işlevini her zamanki gibi kullanmaya log.Print() devam edebilirsiniz.

Günlük altyapıları

Son olarak, paketin işlevlerinin log yeterli olmadığı zamanlar olabilir. Kendi kitaplıklarınızı yazmak yerine bir günlük çerçevesi kullanmayı yararlı bulabilirsiniz. Go için birkaç günlük çerçevesi Logrus, zerolog, zap ve Apex'tir.

Şimdi zerolog ile neler yapabileceğimizi keşfedelim.

İlk olarak paketi yüklemeniz gerekir. Bu seride çalışıyorsanız, büyük olasılıkla go modüllerini zaten kullanıyorsunuzdur, bu nedenle hiçbir şey yapmanız gerekmez. Her ihtimale karşı, sıfır günlüğü kitaplıklarını yüklemek için iş istasyonunuzda şu komutu çalıştırabilirsiniz:

go get -u github.com/rs/zerolog/log

Şimdi denemek için şu kod parçacığını kullanın:

package main

import (
    "github.com/rs/zerolog"
    "github.com/rs/zerolog/log"
)

func main() {
    zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
    log.Print("Hey! I'm a log message!")
}

Önceki kodu çalıştırdığınızda şu çıkışı alırsınız:

{"level":"debug","time":1609855453,"message":"Hey! I'm a log message!"}

Yalnızca doğru içeri aktarma adlarını eklemeniz ve ardından normalde yaptığınız gibi işlevini kullanmaya log.Print() devam edebilirsiniz. Ayrıca çıkışın JSON biçimine nasıl değiştiğine de dikkat edin. JSON, aramaları merkezi bir konumda çalıştırdığınızda günlükler için kullanışlı bir biçimdir.

Bir diğer kullanışlı özellik de bağlam verilerini hızla ekleyebilmenizdir, örneğin:

package main

import (
    "github.com/rs/zerolog"
    "github.com/rs/zerolog/log"
)

func main() {
    zerolog.TimeFieldFormat = zerolog.TimeFormatUnix

    log.Debug().
        Int("EmployeeID", 1001).
        Msg("Getting employee information")

    log.Debug().
        Str("Name", "John").
        Send()
}

Önceki kodu çalıştırdığınızda şu çıkışı alırsınız:

{"level":"debug","EmployeeID":1001,"time":1609855731,"message":"Getting employee information"}
{"level":"debug","Name":"John","time":1609855731}

Çalışan kimliğini bağlam olarak nasıl eklediğimize dikkat edin. Başka bir özellik olarak günlük çizgisinin bir parçası olur. Ayrıca, eklediğiniz alanların kesin olarak yazıldığını vurgulamak önemlidir.

Düzleştirilmiş günlük kullanma, biçimlendirilmiş yığın izlemelerini kullanma ve farklı çıkışları yönetmek için birden fazla günlükçü örneği kullanma gibi zerolog ile diğer özellikleri uygulayabilirsiniz. Daha fazla bilgi için GitHub sitesine bakın.