Pengenalan
Log file adalah sebuah file yang yang berisi semua event yang terjadi di sebuah sistem. Dengan membaca log file, developer dapat mengerti apa yang terjadi, siapa melakukan apa ke sebuah sistem, dan lain-lain. Beberapa sistem memiliki standar mereka untuk menulis log seperti Apache, Nginx, Envoy, dll.
Mungkin menulis logs bukan sebuah masalah, tetapi bagaimana dengan membacanya? Apakah developers mereview dan membaca logs mereka? Apakah mereka dapat dengan mudah memahami logsnya? Apakah mereka mengetahui apa yang terjadi pada sistem saat ini? Mungkin tidak. Itulah dimana aplikasi monitoring seperti Elastic atau Grafana datang untuk membantu melakukan parsing dan memonitor logs file.
Aplikasi monitoring dapat membantu developers membaca sistem log, membuat sebuah peringantan jika terjadi sesuatu yang salah. Tetapi mereka tidak dapat memahami apa yang terjadi kepada sistem. Mereka hanya mengikuti aturan yang dibuat oleh developer. Bagaimana jika developer ingin menaruh sedikit otak
di sistem monitoring agar aplikasi monitoring tersebut dapat memahami apa yang terjadi? Tentu saja dengan membuat model deep learning
untuk menganalisa logs sangat membantu. Tetapi sebelum itu, developer harus memastikan mereka dapat melakukan parsing pada logs.
Di postingan blog ini, kalian akan membuat sebuah logs parser yang sederhana menggunakan Go sebagai langkah awal untuk memahami logs file lebih baik lagi.
Mendefinisikan Format Log
Katakanlah ada satu baris log yang berformat seperti ini:
|
|
Kalian bisa mengekstrak data yang kalian ingin dari baris tersebut, sebagai contoh:
- Timestamp
- HTTP Method
- Request Path
- Response Code
- IPs
Lalu buat format log sesuai dengan baris tersebut. Katakanlah kalian ingin menamakan timestamp
menjadi $time_stamp
, dan data yang tidak penting menjadi $_
. Sekarang kalian akan memiliki string yang berformat seperti ini:
|
|
Jadi kalian bisa membaca logs data kalian seperti ini:
|
|
Membuat Parser
Mari buat sebuah file main.go
dengan data logs dan formatnya. Agar mudah digunakan dengan regex, kalian harus meng-escape simbol spesial di format kalian menggunakan \
.
|
|
Setelah mendefinisikan formatnya, sesuaikan logFormat
kalian dengan format yang dapat dibaca oleh regex. Karena variable yang kalian buat dimulai dengan $
dan hanya mengandung alfanumerik
dan garis bawah
. Kalian dapat mencocokkan dengan regex ini \$([\W_]*)
lalu ubah semua variablenya menjadi named capturing group
di regex. Yang mana menjadi (?P<name>re)
. Karena kalian ingin mengganti <name>
menjadi variable yang telah kalian definisikan, kalian bisa ubah named capturing group
nya menjadi (?P<$1>.*)
. Jadi jika kalian tulis itu ke dalam code, itu akan menjadi seperti ini:
|
|
Sekarang regexFormat
kalian terlihat seperti ini:
|
|
Lalu compile regexFormat
kalian untuk mendapatkan semua data di baris logs tadi.
|
|
Sekarang matches
harusnya sudah memiliki semua data yang telah dicocokkan. Mari print.
|
|
Outputnya terlihat seperti ini:
|
|
Setelah melakukan parsing satu baris log, kalian harusnya bisa mem-parsing semua logs file kalian. Yang kalian harus lakukan hanya mendefinisikan format file kalian. Lalu ubah itu menjadi format yang human-readable seperti langkah sebelumnya.
Ini kode lengkapnya:
|
|
Terima kasih telah membaca!