pemrograman

03 Formatter dan Output Logrus Pada Golang

Pada kali ini kita akan mempelajari dan membahas bagaimana Logger itu memiliki format dan output. Secara default Logger itu pasti memiliki format yang sudah ditentukan apakah itu JSON, file ataupun dalam bentuk format sendiri.

Formatter pada Logrus

Ketika Logrus itu mengirimkan data ke dalam output maka format yang digunakan itu akan menggunakan object Formatter, secara default Logrus memiliki dua formatter yaitu:

  1. TextFormatter yang sering digunakan secara default
  2. JSONFormatter yang digunakan untuk memformat pesan menjadi data JSON.

Jika kita ingin mengubah formatter tersebut kita bisa memanggil fungsi dibawah ini.

logger.SetFormatter(/* formatter name */)

Pada saat melakukan pengujian sebelumnya saat dijalankan menggunakan formatter default yang mana format penulisannya itu seperti ini.

time="2024-04-30T16:35:08+07:00" level=info msg="hello world"
time="2024-04-30T16:35:08+07:00" level=warning msg="hello world warn"
time="2024-04-30T16:35:08+07:00" level=info msg="log info sending to file application"
time="2024-04-30T16:35:08+07:00" level=error msg="error test"

Nah, kita akan mencoba mengubah formatter Logger kita menjadi JSONFormatter. Pertama kita buat file logger_formatter.go dan buat fungsi dengan isi dibawah ini.

func TestFormatting(t *testing.T) {
	logger := logrus.New()
	logger.SetFormatter(&logrus.JSONFormatter{})

	logger.Info("hello world")
	logger.Warn("hello world warn")
	logger.Info("log info sending to file application")
	logger.Error("error test")
}

Ketika dijalankan fungsi unit test tersebut maka akan memberikan informasi logger dengan tampilan JSON seperti dibawah ini.

{"level":"info","msg":"hello world","time":"2024-04-30T16:42:18+07:00"}
{"level":"warning","msg":"hello world warn","time":"2024-04-30T16:42:18+07:00"}
{"level":"info","msg":"log info sending to file application","time":"2024-04-30T16:42:18+07:00"}
{"level":"error","msg":"error test","time":"2024-04-30T16:42:18+07:00"}

Dengan menggunakan format JSON ini kita bisa mengolah data logger tersebut ingin disimpan ke dalam database yang berbasis JSON, misalkan MongoDB maka lebih mudah untuk disimpannya.

Output dari Logrus

Default dari output Logrus adalah console, maka ketika kita lihat atau kita jalankan saat inisialisasi tanpa ada tambahan konfigurasi maka Logrus tersebut akan mengirim logger tersebut ke dalam console kita atau sering kita sebut terminal.

Kadang kala ketika kita sudah memiliki service atau aplikasi pada server production kita butuh untuk mengubah output tujuan log misalkan menjadi File ataupun Database. Maka, seharunsya Logrus ini bisa kita ubah menjadi output yang bisa kita inginkan.

Jika kita lihat dari Logrus library tersebut output dari Logger adalah io.Writer sehingga kita bisa sebenarnya membuat sendiri mengikuti kontrak dari io.Writer.

Output default dari Logrus adalah os.Stderr atau bisa kita lihat di code disini.

https://github.com/sirupsen/logrus/blob/dd1b4c2e81afc5c255f216a722b012ed26be57df/logger.go#L17C1-L50C2

Nah kali ini kita akan mencoba menyimpan output Logrus itu ke dalam suatu file, bagaimana caranya? Kita buat terlebih dahulu file bernama output_test.go dan isi file tersebut dengan kode dibawah ini.

func TestOutput(t *testing.T) {
	logger := logrus.New()

   // initiation create file for logger
	file, err := os.OpenFile("application.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
	if err != nil {
		log.Fatal(err)
	}

   // set output file into logrus
	logger.SetOutput(file)

	logger.Info("hello world")
   logger.Warn("hello world warn")
	logger.Info("log info sending to file application")
   logger.Error("error test")
}

Pada fungsi diatas kita terdapat initialisasi untuk membuat file atau kita sering memakai os.OpenFile. pada method ini perlu mengirimkan:

  • nama file yang akan dibuat
  • flagging digunakan untuk memastikan file yang kita modifikasi itu boleh ditambah, jika belum terbuat file-nya akan dibuat dan hanya bisa ditulis saja misalkan.
  • mode akses, disini sama seperti di linux permission kita memiliki atribute Read (R), Write(W) dan Execute(X).

Mode akses ini menggunakan angka yang mana untuk mengeset attribut suatu file, kita hanya mengetikkan 1 digit file dari setiap segment. Total segment itu terdiri dari 3 digit angka untuk mengeset permission owner, group dan other. Atribut atau permision tersebut adalah:

  1. Read(R) memiliki nilai 4
  2. Write(W) memiliki nilai 2
  3. Executable(X) memiliki nilai 1

Contoh misalkan yang kita memiliki akses dengan kode 0755, maka permissionnya seperti ini

DirectoryOwnerGroupOther
- - -R W XR - XR - X
0+0+04+2+14+0+14+0+1
0755
Contoh lain sesuai pada aplikasi yang sudah kita terapkan yaitu kode 0666 maka seperti dibawah ini:
DirectoryOwnerGroupOther
- - -R W -R W -R W -
0+0+04+2+04+2+04+2+0
0666

Maka, maksud dari kode 0666 ini sebagai berikut:

  • Owner tidak memiliki aksees sama sekali terhadap file tersebut
  • Group memiliki akses terhadap file tersebut hanya membaca dan menulis saja, tidak bisa untuk melakukan eksekusi.
  • Other memiliki akses terhadap file tersebut hanya membaca dan menulis saja tetapi tidak bisa untuk melakukan eksekusi.

Mengapa kita menggunakan kode 0666 tersebut? karena ketika aplikasi berjalan itu memiliki akses sebagai group maka kita set seperti ini.

Pada kode selanjutnya yaitu melakukan set ke dalam output dari Logrus tersebut.

// set output file into logrus
logger.SetOutput(file)

Ketika kita jalankan kode fungsi diatas maka akan terbuat file application.log dan akan berisi logger yang kita set saat berjalan.

time="2024-04-30T16:35:08+07:00" level=info msg="hello world"
time="2024-04-30T16:35:08+07:00" level=warning msg="hello world warn"
time="2024-04-30T16:35:08+07:00" level=info msg="log info sending to file application"
time="2024-04-30T16:35:08+07:00" level=error msg="error test"
comments powered by Disqus