Mari kita bincangkan tentang mekanisme pengelogan ralat biasa di Golang

PHPz
Lepaskan: 2023-04-23 13:53:30
asal
599 orang telah melayarinya

Sebagai bahasa yang sentiasa berkembang, Golang sentiasa memperkenalkan ciri baharu dan menambah lebih banyak perpustakaan, menjadikannya pilihan terbaik untuk pembangunan moden. Walau bagaimanapun, walaupun kod terbaik boleh mempunyai ralat.

Bagi pembangun Golang, log ralat ialah alat yang sangat penting. Ia membolehkan anda mengenal pasti ralat dengan cepat dan membetulkannya, menjadikan aplikasi anda lebih mantap dan boleh dipercayai. Walau bagaimanapun, untuk menggunakan log ralat dengan betul, anda perlu tahu cara membuat, log dan nyahpepijatnya.

Artikel ini akan memperkenalkan mekanisme pengelogan ralat biasa di Golang, termasuk pengendalian ralat asas, mekanisme panik/tangguh, log perpustakaan standard dan perpustakaan log pihak ketiga, serta beberapa amalan terbaik dan kemahiran nyahpepijat.

  1. Pengendalian ralat asas
    Mekanisme pengendalian ralat asas di Golang ialah menggunakan jenis ralat. Ia adalah antara muka yang telah ditetapkan yang digunakan untuk mewakili maklumat ralat yang dikembalikan oleh fungsi atau kaedah tertentu. Jika nilai pulangan fungsi atau kaedah mengandungi nilai ralat jenis, ini bermakna operasi mungkin telah gagal. Anda boleh menggunakan pernyataan if atau menukar pernyataan untuk menyemak nilai ralat dan mengambil tindakan yang sesuai. Contohnya:

func openFile(rentetan nama fail) {

file, err := os.Open(filename)
if err != nil {
    return err
}
defer file.Close()

return nil
Salin selepas log masuk

}

Dalam kod di atas, fungsi openFile membuka fail dan mengembalikan jenis nilai ralat. Jika fail tidak boleh dibuka, ia akan mengembalikan nilai ralat bukan sifar. Dalam program utama anda boleh menyemak nilai ralat yang dikembalikan dan mengambil tindakan yang sesuai:

err := openFile("input.txt")
if err != nil {

log.Fatal(err)
Salin selepas log masuk
Salin selepas log masuk

}

Dalam kes ini, fungsi utama memanggil fungsi openFile dan menyemak ralat yang dikembalikan. Jika ralat berlaku, ia mencetak mesej ralat dan keluar dari program.

  1. Mekanisme panik/Tangguhkan
    Terdapat mekanisme khas dalam Golang yang boleh digunakan apabila ralat maut berlaku dalam program: mekanisme panik/tunda. Apabila program mengalami ralat yang tidak boleh dikendalikan, ia boleh memanggil fungsi panik untuk menimbulkan pengecualian panik, yang akan mengganggu pelaksanaan fungsi semasa dan dinaikkan timbunan panggilan sehingga ia ditangkap dengan betul atau program keluar. Biasanya, anda tidak sepatutnya memanggil fungsi panik secara langsung. Sebaliknya, anda harus menggunakan mekanisme penangguhan untuk menangkap pengecualian dan melakukan beberapa operasi pembersihan, seperti menutup fail, membebaskan memori, dsb. Contohnya:

func openFile(rentetan nama fail) {

file, err := os.Open(filename)
if err != nil {
    panic(err)
}
defer file.Close()

// ... code that uses the file ...
Salin selepas log masuk

}

Dalam coretan kod di atas, fungsi openFile cuba membuka fail. Jika pembukaan gagal, ia akan menimbulkan pengecualian panik. Ia kemudian menggunakan pernyataan tangguh untuk memastikan fail ditutup. Dalam fungsi utama yang sepadan, anda boleh menulis pernyataan pulih untuk menangkap pengecualian dan melaksanakan operasi pembersihan:

func main() {

defer func() {
    if r := recover(); r != nil {
        log.Println("Recovered from panic:", r)
    }
}()

openFile("input.txt")
Salin selepas log masuk

}

di sini Dalam kes ini, fungsi utama menggunakan pernyataan tangguh untuk memastikan ralat ditangkap dalam apa jua keadaan. Jika fungsi openFile menimbulkan pengecualian, pernyataan pulih akan dilaksanakan dan mesej ralat akan dicetak.

  1. Log perpustakaan standard
    Pustaka standard Golang mengandungi sistem pengelogan yang sangat asas: pakej log. Ia mempunyai tiga fungsi output: Print, Printf dan Println. Mereka berfungsi dengan cara yang sama, mereka hanya memformat rentetan secara berbeza. Contohnya:

log.Print("Hello, world!")
log.Printf("Hello, %s!", "world")
log.Println(" Hello ", "world")

Fungsi ini mengeluarkan teks kepada output standard. Jika anda perlu menulis fail log pada fail dan bukannya konsol, gunakan log.SetOutput:

f, err := os.Create("logfile")
if err != nil {

log.Fatal(err)
Salin selepas log masuk
Salin selepas log masuk

}
tunda f.Close()
log.SetOutput(f)

Ini akan mencipta fail bernama logfile dan menulis semua output log pada dokumen itu.

Pakej log Golang juga menyediakan beberapa fungsi lain, seperti membina pembalak tersuai dan menetapkan tahap log, dsb. Lihat dokumentasi rasmi untuk butiran.

  1. Perpustakaan pembalakan pihak ketiga
    Terdapat banyak perpustakaan pembalakan pihak ketiga yang sangat baik dalam komuniti Golang, seperti logrus, zap, zerolog, dsb. Pustaka ini menyediakan lebih banyak ciri dan pilihan seperti pengelogan berstruktur, berbilang output, tahap log boleh disesuaikan dan kawalan medan, dan banyak lagi. Berikut ialah contoh kod menggunakan pustaka logrus:

log import "github.com/sirupsen/logrus"

func main() {

log.SetFormatter(&log.JSONFormatter{})
log.SetLevel(log.WarnLevel)

log.WithFields(log.Fields{
    "animal": "walrus",
    "size":   10,
}).Info("A group of walrus emerges from the ocean")
Salin selepas log masuk

}

Dalam contoh ini, kami menggunakan perpustakaan logrus dan pemformatan JSON. Kemudian kami menetapkan tahap ralat kepada amaran, dan kemudian kami menggunakan kemasukan log logrus, kami menyediakan beberapa medan, dan kami merekodkan mesej bahawa sekumpulan walrus muncul dari lautan.

  1. Petua Nyahpepijat
    Semasa menulis kod, mencari dan membetulkan ralat sentiasa mengambil masa. Berikut ialah beberapa petua penyahpepijatan berguna yang boleh membantu anda menyelesaikan masalah dengan lebih cepat.
  2. Gunakan fmt.Printf untuk mencetak nilai perantaraan.

Apabila anda mendapati bahawa output kod anda tidak seperti yang anda harapkan, anda boleh menggunakan fmt.Printf untuk cuba mengenal pasti masalah. Contohnya:

func foo() {

for i := 0; i < 10; i++ {
    fmt.Printf("%d\n", i)
}
Salin selepas log masuk

}

Dalam kes ini, fungsi foo akan mengeluarkan nombor yang dipilih dalam setiap lelaran gelung , dengan itu membantu kami mengenal pasti masalah.

  1. 使用log.Println或log.Printf记录哪一步失败了。

在某些情况下,您的代码可能会因多个原因之一而失败。使用log.Println或log.Printf来记录当前执行的代码行可以帮助您定位错误。例如:

func openFile(filename string) error {

log.Printf("Trying to open file %s", filename)
file, err := os.Open(filename)
if err != nil {
    log.Printf("Failed to open file %s: %s", filename, err)
    return err
}
defer file.Close()

return nil
Salin selepas log masuk

}

在这种情况下,函数openFile在尝试打开文件之前记录了它正在尝试打开的文件名。如果出现错误,它还将记录哪个文件无法正常打开。

  1. 使用GDB进行调试。

如果您需要深入调试代码,GDB可能是您需要的工具。它是一个强大的调试器,可以与Golang程序一起使用。例如:

$ go build -gcflags "-N -l" -o myprogram
$ gdb ./myprogram

使用上面的命令编译您的Golang程序和调试器。您还需要添加-gcflags“-N -l”标志以确保GDB可以正确识别调试信息。然后,您可以在GDB命令行中运行程序并在其中设置断点和查看变量等。

总结
对于Golang开发者来说,错误日志是一个非常重要的工具,可以帮助识别和解决问题。本文介绍了Golang中常见的错误日志机制,包括基本的错误处理、panic/defer机制、标准库log和第三方日志库,以及一些最佳实践和调试技巧。无论您是新手还是高级开发人员,正确地使用错误日志机制都是必不可少的。

Atas ialah kandungan terperinci Mari kita bincangkan tentang mekanisme pengelogan ralat biasa di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!