66 / 68

log

log paketi

log — dasturning ishlash jarayonida nima bo'layotganini yozib borish (loglash) uchun mo'ljallangan standart paket. fmt.Println()dan farqli o'laroq, log har bir yozuvga avtomatik ravishda sana va vaqt qo'shadi, hamda dasturni darhol to'xtatuvchi maxsus funksiyalarga ega.

example.go
import "log"

1. Oddiy loglash: Println() va Printf()

example.go
package main

import "log"

func main() {
    log.Println("Bu oddiy log yozuvi")
    log.Printf("Foydalanuvchi: %s, Yosh: %d", "Ali", 25)
}

Natija (sana/vaqt ishga tushirgan paytingizga qarab boshqacha bo'ladi):

kod
2026/09/25 00:33:14 Bu oddiy log yozuvi
2026/09/25 00:33:14 Foydalanuvchi: Ali, Yosh: 25

E'tibor bering: fmt.Println()dan farqli o'laroq, log.Println() avtomatik ravishda sana va vaqtni qo'shdi — buni qo'lda yozishning hojati yo'q.


2. Xatolik bilan dasturni to'xtatish: Fatal()

log.Fatal() (va uning Fatalf()/Fatalln() variantlari) xabarni chop etib, so'ngra os.Exit(1) chaqiradi — ya'ni dasturni darhol xatolik kodi bilan to'xtatadi:

example.go
package main

import (
    "fmt"
    "log"
)

func someRiskyOperation() (string, error) {
    return "", fmt.Errorf("nimadir noto'g'ri ketdi")
}

func main() {
    log.Println("Dastur ishga tushdi")

    _, err := someRiskyOperation()
    if err != nil {
        log.Fatal("Jiddiy xatolik: ", err) // shu yerda dastur to'xtaydi
    }

    log.Println("Bu qator hech qachon bajarilmaydi")
}

Natija:

kod
2026/09/25 00:33:14 Dastur ishga tushdi
2026/09/25 00:33:14 Jiddiy xatolik: nimadir noto'g'ri ketdi

[!WARNING] log.Fatal() xuddi os.Exit() kabi dasturni darhol to'xtatadi — defer orqali rejalashtirilgan tozalash amallari (fayl yopish va h.k.) ishlamay qoladi! Uni faqat main() funksiyasida yoki dastur davom eta olmaydigan haqiqatan ham jiddiy xatoliklarda ishlating. Oddiy, "kutilgan" xatoliklar uchun (masalan, foydalanuvchi noto'g'ri ma'lumot kiritganda) xatolikni oddiy return err orqali qaytarish to'g'riroq.

Shuningdek, log.Panic() ham bor — u Fatal()ga o'xshaydi, lekin os.Exit() o'rniga panic()ni chaqiradi (ya'ni uni recover() bilan "ushlab qolish" mumkin).


3. Maxsus logger yaratish: log.New()

Katta dasturlarda ko'pincha loglarni boshqa manzilga (masalan, faylga) yozish yoki har bir yozuv oldiga o'ziga xos "prefiks" qo'shish kerak bo'ladi. Buning uchun log.New() orqali o'z logger'ingizni yaratasiz:

example.go
package main

import (
    "log"
    "os"
)

func main() {
    // parametrlar: qayerga yozish, prefiks, qo'shimcha bayroqlar (flags)
    logger := log.New(os.Stdout, "MYAPP: ", log.Ldate|log.Ltime|log.Lshortfile)

    logger.Println("Fayl va qator raqami bilan")
}

Natija:

kod
MYAPP: 2026/09/25 00:33:14 main.go:10: Fayl va qator raqami bilan

log.Lshortfile bayrog'i tufayli, qaysi fayl va qatordan chaqirilganini (main.go:10) ham ko'rsatadi — bu disk raskadrovka (debugging) qilishda juda foydali.


4. Loglarni faylga yoki xotiraga yozish

log.New()ning birinchi parametri istalgan io.Writer bo'lishi mumkin — demak, loglarni konsol o'rniga faylga ham yo'naltirish mumkin:

example.go
package main

import (
    "log"
    "os"
)

func main() {
    file, err := os.OpenFile("dastur.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    logger := log.New(file, "", log.LstdFlags)
    logger.Println("Bu yozuv konsolga emas, dastur.log fayliga yoziladi")
}

Bu yerda file — os.File turi bo'lib, u ham io.Writer interfeysini amalga oshiradi, shuning uchun uni to'g'ridan-to'g'ri log.New()ga berish mumkin.


Xulosa: qachon qaysi funksiya kerak?

VazifaFunksiya
Sana/vaqt bilan oddiy loglashlog.Println() / log.Printf()
Xatolik bilan darhol to'xtatishlog.Fatal()
To'xtatish + keyinroq "ushlab olinishi" mumkin bo'lgan xatoliklog.Panic()
Maxsus prefiks/bayroqlar bilan loggerlog.New(qayerga, prefiks, bayroqlar)
Loglarni faylga yozishlog.New(file, ...)

[!NOTE] Katta production loyihalarda ko'pincha standart log o'rniga tuzilgan (structured) loglash imkonini beruvchi kutubxonalar (masalan, standart kutubxonaning o'zidagi yangi log/slog paketi, Go 1.21+) ishlatiladi — ular loglarni JSON kabi formatlarda, qidirish va filtrlashga qulay tarzda yozadi. Lekin oddiy dastur va kichik xizmatlar uchun log paketining o'zi to'liq yetarli.