Saya mencoba menulis ke file log dengan Go.
Saya telah mencoba beberapa pendekatan, yang semuanya gagal. Inilah yang telah saya coba:
func TestLogging(t *testing.T) {
if !FileExists("logfile") {
CreateFile("logfile")
}
f, err := os.Open("logfile")
if err != nil {
t.Fatalf("error: %v", err)
}
// attempt #1
log.SetOutput(io.MultiWriter(os.Stderr, f))
log.Println("hello, logfile")
// attempt #2
log.SetOutput(io.Writer(f))
log.Println("hello, logfile")
// attempt #3
log.SetOutput(f)
log.Println("hello, logfile")
}
func FileExists(name string) bool {
if _, err := os.Stat(name); err != nil {
if os.IsNotExist(err) {
return false
}
}
return true
}
func CreateFile(name string) error {
fo, err := os.Create(name)
if err != nil {
return err
}
defer func() {
fo.Close()
}()
return nil
}
File log dibuat, tetapi tidak ada yang dicetak atau ditambahkan ke dalamnya. Mengapa?
Jawaban:
os.Open()
pasti bekerja secara berbeda di masa lalu, tetapi ini berhasil untuk saya:Berdasarkan dokumen Go,
os.Open()
tidak bisa berfungsi untuklog.SetOutput
, karena membuka file "untuk membaca:"EDIT
Pindah
defer f.Close()
ke setelahif err != nil
ceksumber
f
mungkinnil
, yang akan menyebabkan kepanikan. Jadierr
disarankan untuk memeriksa sebelum menunda panggilan.Open
tidak bekerja denganlog.SetOutput
?Saya lebih suka kesederhanaan dan fleksibilitas dari rekomendasi aplikasi 12 faktor untuk logging. Untuk menambahkan ke file log Anda dapat menggunakan pengalihan shell. Logger default di Go menulis ke stderr (2).
Lihat juga: http://12factor.net/logs
sumber
$ cd /etc/systemd/system
$ sudo vi app.service ExecStart=/bin/bash -c 'sudo go run main.go >> /home/ubuntu/go/src/html_menu_1/logfile'
Saya TIDAK bekerjaUbuntu 18.04.3
Saya biasanya mencetak log di layar dan menulis ke dalam file juga. Semoga ini bisa membantu seseorang.
sumber
Ini berhasil untuk saya
membuat paket bernama logger.go
impor paket ke mana pun Anda ingin masuk, misalnya main.go
sumber
Jika Anda menjalankan biner di mesin linux, Anda dapat menggunakan skrip shell.
menimpa menjadi file
menambahkan ke dalam file
menimpa stderr menjadi file
menambahkan stderr ke dalam file
itu bisa lebih dinamis menggunakan file skrip shell.
sumber
Logger default di Go menulis ke stderr (2). alihkan ke file
sumber
Deklarasikan top di global Anda
var
sehingga semua proses Anda dapat mengakses jika diperlukan.sumber
go version go1.10.2 windows/amd64
, apa milik Anda?outfile, _ = os.Create("my.log")
dan itu akan berfungsi seperti yang diharapkan.outfile, _ = os.Create("./path/to/my.log")
. Entah bagaimana saya memiliki harapan bahwa kode tersebut akan membuatpath/to
folder danmy.log
file, tetapi ternyata itu tidak berhasil. Saya menyarankan agar Anda mengubah jawaban Anda menjadioutfile, _ = os.Create("./my.log")
. Dengan cara itu kita tahu dengan jelas bahwa itu membuat log di folder saat ini.Berdasarkan jawaban Allison dan Deepak, saya mulai menggunakan logrus dan sangat menyukainya:
Saya memiliki penundaan f.Close () di fungsi utama
sumber
Saya menulis log ke file, yang dihasilkan setiap hari (per hari satu file log dibuat). Pendekatan ini bekerja dengan baik untuk saya:
Metode "shortenFilePath ()" digunakan untuk mendapatkan nama file dari jalur lengkap file. dan metode "LogServer ()" digunakan untuk membuat pernyataan log yang diformat (berisi: nama file, nomor baris, level log, pernyataan kesalahan, dll ...)
sumber
Untuk membantu orang lain, saya membuat fungsi log dasar untuk menangani logging dalam kedua kasus, jika Anda ingin output ke stdout, kemudian aktifkan debug, langsung saja lakukan flag switch sehingga Anda dapat memilih output Anda.
sumber
mungkin ini akan membantu Anda (jika file log ada, gunakan, jika tidak ada, buatlah):
Untuk detail lebih lanjut: https://su9.co/9BAE74B
sumber