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.
import "log"
Println() va Printf()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):
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.
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:
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:
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()xuddios.Exit()kabi dasturni darhol to'xtatadi —deferorqali rejalashtirilgan tozalash amallari (fayl yopish va h.k.) ishlamay qoladi! Uni faqatmain()funksiyasida yoki dastur davom eta olmaydigan haqiqatan ham jiddiy xatoliklarda ishlating. Oddiy, "kutilgan" xatoliklar uchun (masalan, foydalanuvchi noto'g'ri ma'lumot kiritganda) xatolikni oddiyreturn errorqali 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).
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:
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:
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.
log.New()ning birinchi parametri istalgan io.Writer bo'lishi mumkin — demak, loglarni konsol o'rniga faylga ham yo'naltirish mumkin:
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.
| Vazifa | Funksiya |
|---|---|
| Sana/vaqt bilan oddiy loglash | log.Println() / log.Printf() |
| Xatolik bilan darhol to'xtatish | log.Fatal() |
| To'xtatish + keyinroq "ushlab olinishi" mumkin bo'lgan xatolik | log.Panic() |
| Maxsus prefiks/bayroqlar bilan logger | log.New(qayerga, prefiks, bayroqlar) |
| Loglarni faylga yozish | log.New(file, ...) |
[!NOTE] Katta production loyihalarda ko'pincha standart
logo'rniga tuzilgan (structured) loglash imkonini beruvchi kutubxonalar (masalan, standart kutubxonaning o'zidagi yangilog/slogpaketi, Go 1.21+) ishlatiladi — ular loglarni JSON kabi formatlarda, qidirish va filtrlashga qulay tarzda yozadi. Lekin oddiy dastur va kichik xizmatlar uchunlogpaketining o'zi to'liq yetarli.