Go by Example: Logging

Go standart kutubxonasi Go dasturlaridan loglarni chiqarish uchun sodda vositalarni taqdim etadi: erkin shakldagi chiqish uchun log paketi va tuzilmali chiqish uchun log/slog paketi.

package main
import (
    "bytes"
    "fmt"
    "log"
    "os"
    "log/slog"
)
func main() {

log paketidan Println kabi funksiyalarni oddiy chaqirish standart loggerdan foydalanadi, u allaqachon os.Stderr ga oqilona log chiqarish uchun oldindan sozlangan. Fatal* yoki Panic* kabi qo’shimcha metodlar logdan keyin dasturdan chiqadi.

    log.Println("standard logger")

Loggerlar chiqish formatini belgilash uchun bayroqlar bilan sozlanishi mumkin. Standart holatda, standart loggerda log.Ldate va log.Ltime bayroqlari o’rnatilgan va ular log.LstdFlags da to’plangan. Masalan, biz uning bayroqlarini vaqtni mikrosekund aniqligida chiqarish uchun o’zgartirishimiz mumkin.

    log.SetFlags(log.LstdFlags | log.Lmicroseconds)
    log.Println("with micro")

U, shuningdek, log funksiyasi chaqirilgan fayl nomi va qatorni chiqarishni qo’llab-quvvatlaydi.

    log.SetFlags(log.LstdFlags | log.Lshortfile)
    log.Println("with file/line")

Maxsus logger yaratish va uni uzatish foydali bo’lishi mumkin. Yangi logger yaratganda, biz uning chiqishini boshqa loggerlardan ajratish uchun prefiks o’rnatishimiz mumkin.

    mylog := log.New(os.Stdout, "my:", log.LstdFlags)
    mylog.Println("from mylog")

Biz mavjud loggerlarda (shu jumladan standart loggerda) prefiksni SetPrefix metodi bilan o’rnatishimiz mumkin.

    mylog.SetPrefix("ohmy:")
    mylog.Println("from mylog")

Loggerlar maxsus chiqish maqsadlariga ega bo’lishi mumkin; istalgan io.Writer ishlaydi.

    var buf bytes.Buffer
    buflog := log.New(&buf, "buf:", log.LstdFlags)

Bu chaqiruv log chiqishini buf ga yozadi.

    buflog.Println("hello")

Bu aslida uni standart chiqishda ko’rsatadi.

    fmt.Print("from buflog:", buf.String())

slog paketi tuzilmali log chiqishini taqdim etadi. Masalan, JSON formatida loglash sodda.

    jsonHandler := slog.NewJSONHandler(os.Stderr, nil)
    myslog := slog.New(jsonHandler)
    myslog.Info("hi there")

Xabardan tashqari, slog chiqishi ixtiyoriy sondagi key=value juftliklarini o’z ichiga olishi mumkin.

    myslog.Info("hello again", "key", "val", "age", 25)
}

Namuna chiqish; chiqarilgan sana va vaqt misol qachon ishga tushirilganiga bog’liq bo’ladi.

$ go run logging.go
2023/08/22 10:45:16 standard logger
2023/08/22 10:45:16.904141 with micro
2023/08/22 10:45:16 logging.go:40: with file/line
my:2023/08/22 10:45:16 from mylog
ohmy:2023/08/22 10:45:16 from mylog
from buflog:buf:2023/08/22 10:45:16 hello

Bular veb-saytda taqdimot aniqligi uchun bir nechta qatorga bo’lingan; aslida ular bitta qatorda chiqariladi.

{"time":"2023-08-22T10:45:16.904166391-07:00",
 "level":"INFO","msg":"hi there"}
{"time":"2023-08-22T10:45:16.904178985-07:00",
    "level":"INFO","msg":"hello again",
    "key":"val","age":25}

Keyingi misol: .