Go: Menulis Log ke File

Go: Menulis Log ke File

Jika kamu menjalankan aplikasi di server, kamu perlu menulis log aplikasi ke file. Ini akan membantu kamu men-debug dan menganalisis aplikasi kamu. File log yang baik akan memberi tahu kamu apa kesalahannya, kapan itu terjadi, dan dari mana asalnya. Artikel ini akan menunjukkan cara menulis log ke file di Go.

Mengapa menulis log ke file?

Log adalah bagaimana aplikasi menceritakan kisahnya kepada engineer. Itu mencatat peristiwa yang terjadi pada aplikasi. Sebagai seorang engineer, kamu perlu memantau log aplikasi kamu, terutama log error. Aplikasi yang berjalan di environment production atau bahkan staging perlu menulis log ke file. Ini untuk mempermudah menemukan log dan melihat log yang penting. Ini dapat membantu kamu menentukan apakah kesalahannya kritis atau tidak. Log yang baik juga membantu kamu menemukan root cause dari error lebih cepat.

Cara menulis log ke file

Untuk menulis log ke file di Go, kita perlu membuka file terlebih dahulu dan kemudian mengatur output log ke file. Mari kita lihat contoh kode di bawah ini.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main

import (
    "log"
    "os"
)

func main() {
    file, err := openLogFile("./mylog.log")
    if err != nil {
        log.Fatal(err)
    }
    log.SetOutput(file)
    log.SetFlags(log.LstdFlags | log.Lshortfile | log.Lmicroseconds)

    log.Println("log file created")
}

func openLogFile(path string) (*os.File, error) {
    logFile, err := os.OpenFile(path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
    if err != nil {
        return nil, err
    }
    return logFile, nil
}

Pada baris 9, kita memanggil fungsi openLogFile yang tertulis pada baris 19. Fungsinya untuk membuka file di OS di lokasi file yang diberikan. Kita melakukan ini dengan memanggil fungsi os.OpenFile. Function ini membutuhkan parameter yaitu lokasi file, flag, dan izin file.
Flags yang kita gunakan adalah:

  • os.O_WRONLY: buka file write-only
  • os.O_APPEND: menambahkan data ke file saat menulis.
  • os.O_CREATE: buat file baru jika tidak ada.

Dan file tersebut diberi izin 644 saat dibuat. Jika kamu ingin membaca lebih lanjut tentang izin file, kamu dapat membaca di sini.

Pada baris 13, kita mengatur output log ke file yang telah kita buka.

Pada baris 14, kita mengatur flag ke log, sehingga menunjukkan tanggal dan waktu, dan baris kode yang menulis log.

Di bawah ini adalah contoh log yang dihasilkan.

2021/10/10 02:38:37.129447 main.go:16: log file created

Di sana kita bisa melihat main.go:16 adalah kode yang memanggil log.Println. Hanya ditulis nama file karena kita menggunakan flag log.Lshortfile. Jika kamu memerlukan path lengkap, kamu dapat menggunakan log.Llongfile sebagai gantinya.

Memisahkan logs file

Terkadang kita ingin memisahkan file log berdasarkan event yang menyebabkannya. Contoh kasus adalah kita memisahkan log error dan log info. Kita dapat melakukan ini dengan membuat logger terpisah untuk error dan info.
Lihat kode di bawah ini.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package main

import (
    "log"
    "os"
)

func main() {
    // create info log
    fileInfo, err := openLogFile("./myinfo.log")
    if err != nil {
        log.Fatal(err)
    }
    infoLog := log.New(fileInfo, "[info]", log.LstdFlags|log.Lshortfile|log.Lmicroseconds)
    infoLog.Println("this is info")

    // create error log
    fileError, err := openLogFile("./myerror.log")
    if err != nil {
        log.Fatal(err)
    }
    errorLog := log.New(fileError, "[error]", log.LstdFlags|log.Lshortfile|log.Lmicroseconds)
    errorLog.Println("this is error")
}

func openLogFile(path string) (*os.File, error) {
    logFile, err := os.OpenFile(path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
    if err != nil {
        return nil, err
    }
    return logFile, nil
}

Hasilnya seperti ini. info.log:

[info]2021/10/10 03:36:38.734009 main.go:15: this is info

error.log:

[error]2021/10/10 03:36:38.735311 main.go:23: this is error

Kesimpulan

Menulis log ke file penting agar kita bisa melihat event yang terjadi pada aplikasi kita. Hal ini dapat dilakukan dengan mengatur output dari log. Kita dapat memisahkan log ke dalam file yang berbeda agar lebih mudah dimonitor.

go  logs  linux 

See also

comments powered by Disqus