- Buat satu log. Logger dan bagikan?
Itu mungkin. Sebuah log.Logger bisa digunakan secara bersamaan dari beberapa goroutine.
- Berikan pointer ke log itu. Logger?
log.New mengembalikan *Logger
yang biasanya merupakan indikasi bahwa Anda harus meneruskan objek sebagai penunjuk. Meneruskannya sebagai nilai akan membuat salinan dari struct (yaitu salinan Logger) dan kemudian beberapa goroutine mungkin menulis ke io.Writer yang sama secara bersamaan. Itu mungkin masalah serius, tergantung pada implementasi penulisnya.
- Haruskah setiap goroutine atau fungsi membuat logger?
Saya tidak akan membuat logger terpisah untuk setiap fungsi atau goroutine. Goroutine (dan fungsi) digunakan untuk tugas-tugas yang sangat ringan yang tidak akan membenarkan pemeliharaan pencatat terpisah. Mungkin ide yang bagus untuk membuat logger untuk setiap komponen yang lebih besar dari proyek Anda. Misalnya, jika proyek Anda menggunakan layanan SMTP untuk mengirim email, membuat logger terpisah untuk layanan email terdengar seperti ide yang bagus sehingga Anda dapat memfilter dan mematikan keluaran secara terpisah.
- Haruskah saya membuat logger sebagai variabel global?
Itu tergantung pada paket Anda. Dalam contoh layanan email sebelumnya, mungkin ide yang bagus untuk memiliki satu pencatat untuk setiap layanan Anda, sehingga pengguna dapat mencatat kegagalan saat menggunakan layanan email gmail secara berbeda dari kegagalan yang terjadi saat menggunakan MTA lokal (mis. Sendmail ).
io.Writer
antarmuka dan Anda mengubah keluaran dari pencatat default melaluiSetOutput()
.Ini adalah logger sederhana
Anda bisa menggunakannya dengan cara ini
sumber
Saya tahu pertanyaan ini agak lama, tetapi jika, seperti saya, proyek Anda terdiri dari beberapa file yang lebih kecil, saya memilih opsi ke-4 Anda - Saya telah membuat
logger.go
yang merupakan bagian dari paket utama. File go ini membuat logger, menugaskannya ke file, dan menyediakannya ke main. Catatan Saya belum menemukan cara yang anggun untuk menutup errorlog ...sumber
defer errorlog.Close()
di akhir eksekusi, atau untuk lebih memastikannya tertutup, atur penangan sinyal menggunakan paket sinyal Go golang.org/pkg/os/signalIni adalah pertanyaan lama, tapi saya ingin menyarankan penggunaan http://github.com/romana/rlog (yang kami kembangkan). Ini dikonfigurasi melalui variabel lingkungan, objek logger dibuat dan diinisialisasi ketika rlog diimpor. Oleh karena itu, tidak perlu melewati logger.
rlog memiliki beberapa fitur:
Ini sangat kecil, tidak memiliki ketergantungan eksternal, kecuali pustaka Golang standar dan sedang dikembangkan secara aktif. Contoh disediakan di repo.
sumber
Saya menemukan paket log default ( https://golang.org/pkg/log/ ) agak membatasi. Misalnya, tidak ada dukungan untuk info vs. log debug.
Setelah melihat-lihat, gunakan https://github.com/golang/glog . Ini tampaknya menjadi porta https://github.com/google/glog dan memberikan fleksibilitas yang layak dalam logging. Misalnya saat menjalankan aplikasi secara lokal Anda mungkin menginginkan log level DEBUG tetapi mungkin ingin menjalankan hanya di tingkat INFO / ERROR dalam produksi. Daftar fitur / panduan lengkap ada, di sini https://google-glog.googlecode.com/svn/trunk/doc/glog.html (Ini untuk modul c ++, tetapi sebagian besar diterjemahkan ke port golang)
sumber
Salah satu modul logging yang bisa Anda pertimbangkan adalah klog . Ini mendukung logging 'V' yang memberikan fleksibilitas untuk log pada level tertentu
klog adalah garpu glog dan mengatasi kelemahan berikut
Implementasi Sampel
sumber