-- Go

Go ile Mini Log Uygulaması

Merhabalar,

Geliştirdiğimiz GOLang uygulamaları içerisinde hata, sorun tespiti vb. gibi bazı durumlarda bilgi almak ya da bir veri kaynağına bu veriyi depolama ihtiyacı duyarız. Buna genel anlamda loglama diyoruz. Bu logları daha sonra gerek bilgi gerek uygulamanın güçlendirilmesi gerekse de oluşan hataların giderilmesi için inceleriz. GOLang ile de gelişmiş bir çok farklı kütüphanesi olsa da en basit ve temel olarak kendi paketleri içerisinde bulunan log mekanizmasını inceliyor olacağız.

Olası genel loglama durumları;

  • TRACE : Belli koşullarda gerçekleştiren olayları “izlemek” amacıyla kullanılır. Örn; sistem performansı, güvenlik politikaları, işlemler vb. Kritik değildir. Uygulama bazında gereklidir.
  • INFO : Uygulama içerisinde gerçekleşen ve yorum ya da açıklama gereken olası durumlar için kullanılan bilgi notudur. Örn; “X no’lu kullanıcı, X zamanda, 123 no’lu bankamatikten, 456 no’lu bankamatiğe 50 TL havale işlemi gerçekleştirdi.
  • WARNING : Kullanıcı ya da uygulama bazında gerçekleşen kritiklik seviyesi çok yüksek olmayan ama işlemsel sorunlara neden olabilecek önemli bilgilendirme uyarılarıdır.
  • ERROR : Kullanıcı, uygulama ya da tüm platform bazında gerçekleşebilecek olası yazılımsal ve işlemsel hatalarda kullanılır. Uygulamanın çökmesi ya da kullanıcının basit bir sıfıra bölme işlemi gerçekleştirme isteği buna birer örnektir.

Örnek uygulamamızda bu 4 seviyeyi de işleyecek ve gerekli aksiyonları alacağız. Örneğin TRACE modunda bir log tutmayacağız. Eğer istenirse bir konsol ekranında olası TRACE durumları akış şeklinde gösterilebilir. INFO, WARNING ve ERROR durumlarında konsol ekranından bu bilgilendirmeleri göstereceğiz. Aynı zamanda WARNING ve ERROR durumlarında hem konsoldan göstereceğiz hem de logs.txt adında bir dosya oluşturup içerisine ilgili logları yazacağız.

package main

import (
    "io"
    "io/ioutil"
    "log"
    "os"
)

var (
    Trace *log.Logger
    Info *log.Logger
    Warning *log.Logger
    Error *log.Logger
)

func init() {

    file, err := os.OpenFile("logs.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)

    if err != nil {
        log.Fatalln("Log dosyası oluşturulurken bir hata meydana geldi : ", err)
    }

    Trace = log.New(ioutil.Discard, "TRACE : ", log.Ldate|log.Ltime|log.Lshortfile)
    Info = log.New(os.Stdout, "INFO : ", log.Ldate|log.Ltime|log.Lshortfile)
    Warning = log.New(io.MultiWriter(file, os.Stderr), "WARNING : ", log.Ldate|log.Ltime|log.Lshortfile)
    Error = log.New(io.MultiWriter(file, os.Stderr), "ERROR : ", log.Ldate|log.Ltime|log.Lshortfile)
}

func main() {

    Trace.Println("Olağan ıvır zıvır birşeyler var.")
    Info.Println("Özel bilgilendirme ya da loglama gerekecek bilgi var.")
    Warning.Println("Bu önemli bir durum! Olağan dışı bir müdahale gerekebilir.")
    //Error.Println("Bu bir hata! Artık çok geç!")

}

Uygulamayı çalıştırdığınızda konsol ekran çıktısı;

x1

 
Oluşturulan logs.txt dosya içeriği;

WARNING : 2016/09/08 15:08:04 customizelog.go:35: Bu önemli bir durum! Olağan dışı bir müdahale gerekebilir.

Şahsen uygulama içerisinde sadece WARNING ve ERROR loglarına kayıt imkanı verdiğim için logs.txt de INFO bilgisi bulunmamaktadır. Eğer ERROR logu da üretseydim o da logs.txt de kayıtlı olacaktı.

İyi çalışmalar.
Cihan Özhan

Yorumla

Yorum