Kursus
Jika Anda baru mulai belajar Python dan ingin mendalami lebih jauh, ikuti kursus Introduction to Data Science in Python dari DataCamp.
Secara umum, logging adalah cara untuk menyimpan catatan (log) yang dihasilkan dari sebuah program komputer. Berkas log biasanya berisi serangkaian catatan kejadian yang terjadi di kode Anda (misalnya, kode Python) atau di sebuah sistem operasi. Kejadian atau pesan ini ditulis ke dalam berkas log; sebuah pesan atau kejadian juga bisa berupa komunikasi antara berbagai pengguna.
Biasanya, cara menghasilkan log bergantung pada pengembang. Mungkin mereka ingin mencatat setiap operasi dari aplikasi yang dikembangkan, hanya mencatat saat terjadi error, atau memantau operasi penting yang dilakukan pengguna dan merekamnya. Operasi penting bisa berupa memeriksa aplikasi atau server diakses oleh end-user atau alamat IP mana, dan jika terjadi percobaan yang tidak berhasil, pengembang dapat mencari bantuan dari log untuk memberi wawasan yang lebih baik daripada sekadar stack trace.
Contoh yang bagus adalah ketika Anda mencoba melakukan instalasi di Linux sebagai pengguna sudo padahal Anda bukan pengguna sudo. Anda melihat pesan "Xyz is not in the sudoers file. This incident will be reported", yang ditulis ke dalam berkas log.
Kabar baiknya, Python hadir dengan modul logging bawaan, dan Anda bisa langsung menggunakannya tanpa instalasi.
Apa bedanya logging dengan Fungsi Print?
Logging serupa secara semangat dengan Fungsi Print. Namun, fungsi Print tidak memuat banyak informasi yang mungkin berguna bagi pengembang. Sebaliknya, logging dapat merekam timestamp dan nomor baris saat error terjadi. Logging dapat menulis error atau informasi apa pun ke berkas, socket, dll., dan menawarkan lima jenis tingkat keparahan yang dapat Anda gunakan untuk membedakan logging Anda.
Lima Tingkat Logging seperti ditunjukkan di sini adalah:
-
Debug (10): Berguna untuk mendiagnosis masalah dalam kode.
-
Info (20): Dapat bertindak sebagai pengakuan bahwa tidak ada bug dalam kode. Salah satu use case yang baik untuk logging level Info adalah memantau progres pelatihan model machine learning.
-
Warning (30): Mengindikasikan masalah yang bisa terjadi di masa depan. Misalnya, peringatan modul yang mungkin dihentikan di masa depan atau peringatan memori rendah.
-
Error (40): Bug serius dalam kode, bisa berupa syntax error, error kehabisan memori, exception.
-
Critical (50): Error yang dapat menyebabkan program berhenti berfungsi atau keluar secara tiba-tiba.
Cukup teori, bukan?
Sekarang mari pahami bagaimana Anda dapat menerapkan logging dalam kode Python.
Tetapi sebelum itu, mari lihat tabel atribut logging; Anda akan menggunakan beberapa atribut logging di bawah ini dalam tutorial hari ini.
import logging
Sekarang Anda akan memanggil metode basicConfig(), yang membantu membuat konfigurasi dasar agar sistem logging berjalan mulus.
Metode ini memungkinkan Anda mengatur parameter berikut:
- tingkat keparahan logging: lima tingkat logging.
- mencatat kejadian ke dalam sebuah berkas.
- hanya mencatat log saat ini dengan menimpa log lama menggunakan filemode.
- format berkas tempat log disimpan.
Ingat bahwa metode basicConfig() bersifat opsional, dan Anda mungkin ingin melewatinya.
logging.basicConfig()
Sekarang mari buat lima tingkat keparahan.
logging.debug("A Debug Logging Message")
logging.info("A Info Logging Message")
logging.warning("A Warning Logging Message")
WARNING:root:A Warning Logging Message
logging.error("An Error Logging Message")
ERROR:root:An Error Logging Message
logging.critical("A Critical Logging Message")
CRITICAL:root:A Critical Logging Message
Seperti yang dapat Anda lihat dari output di atas, hanya yang memiliki tingkat keparahan lebih besar dari 20 yang berhasil dicatat karena itulah konfigurasi default logging di Python.
Namun, seperti dibahas di atas, Anda dapat memodifikasi tingkat keparahan menggunakan metode basicConfig(). Di sini Anda akan mengubah tingkat keparahan menjadi 20, yang berarti tingkat logging dengan keparahan lebih besar dari 10 akan dicatat.
Catatan: Harap mulai ulang kernel sebelum menjalankan sel di bawah untuk melihat output yang benar.
import logging
logging.basicConfig(level=logging.INFO)
logging.debug("A Debug Logging Message")
logging.info("A Info Logging Message")
INFO:root:A Info Logging Message
logging.warning("A Warning Logging Message")
WARNING:root:A Warning Logging Message
logging.error("An Error Logging Message")
ERROR:root:An Error Logging Message
logging.critical("A Critical Logging Message")
CRITICAL:root:A Critical Logging Message
Sekarang mari simpan output di atas ke dalam sebuah berkas log. Untuk mencapainya, Anda akan menggunakan metode basicConfig().
import logging
logging.basicConfig(level = logging.INFO, filename = 'datacamp.log')
logging.debug("A Debug Logging Message")
logging.info("A Info Logging Message")
logging.warning("A Warning Logging Message")
logging.error("An Error Logging Message")
logging.critical("A Critical Logging Message")

Seperti yang Anda lihat, sekarang log dihasilkan dalam berkas log datacamp.log. Saat menjalankan sel-sel di atas berkali-kali, Anda akan melihat bahwa log akan ditambahkan ke berkas log sebanyak itu. Secara default, berkas berada dalam mode append.

Anda dapat menggunakan keyword filemode untuk mencegah berkas log ditulis dengan banyak salinan log, yakni mode append. Filemode dapat diubah ke mode write, yang akan menimpa log sebelumnya dan hanya menyimpan log saat ini. Karena filemode disetel ke w, ini berarti berkas log akan dibuka dalam write mode setiap kali basicConfig() dijalankan, yang pada akhirnya akan menimpa berkas.
Fungsionalitas mode berkas dalam logging mirip dengan penanganan berkas standar yang ditawarkan Python.
import logging
logging.basicConfig(level = logging.INFO, filename = 'datacamp.log', filemode = 'w')
logging.debug("A Debug Logging Message")
logging.info("A Info Logging Message")
logging.warning("A Warning Logging Message")
logging.error("An Error Logging Message")
logging.critical("A Critical Logging Message")
Mari jalankan baris-baris kode di atas beberapa kali. Anda akan melihat bahwa kali ini hanya entri log saat ini yang disimpan, dan yang sebelumnya akan ditimpa, seperti ditunjukkan di bawah.

Sekarang mari lihat beberapa atribut logging lainnya seperti tanggal, waktu, dan nomor baris saat peringatan atau error dihasilkan. Nah, seperti yang mungkin Anda setujui sekarang, semua ini adalah keunggulan dibandingkan fungsi Print sederhana dan jauh lebih andal daripada sekadar fungsi Print.
Untuk mencapai ini, Anda akan meneruskan atribut logging asctime dan lineno. Anda juga akan meneruskan atribut message, yang akan menjadi placeholder untuk pesan yang ingin Anda tampilkan di log. Semua atribut ini akan diteruskan ke metode format.
import logging
logging.basicConfig(format='Date-Time : %(asctime)s : Line No. : %(lineno)d - %(message)s', \
level = logging.DEBUG)
logging.debug("A Debug Logging Message")
logging.info("A Info Logging Message")
logging.warning("A Warning Logging Message")
logging.error("An Error Logging Message")
logging.critical("A Critical Logging Message")
Date-Time : 2020-03-18 23:58:12,429 : Line No. : 1 - A Debug Logging Message
Date-Time : 2020-03-18 23:58:12,436 : Line No. : 2 - A Info Logging Message
Date-Time : 2020-03-18 23:58:12,437 : Line No. : 3 - A Warning Logging Message
Date-Time : 2020-03-18 23:58:12,440 : Line No. : 4 - An Error Logging Message
Date-Time : 2020-03-18 23:58:12,441 : Line No. : 5 - A Critical Logging Message
Mari lihat definisi masing-masing atribut langsung dari tabel ini.
-
asctime: Waktu yang mudah dibaca manusia saat LogRecord dihasilkan. Secara default, bentuknya adalah2020-03-18 22:24:42,670(angka setelah koma adalah bagian milidetik dari waktu). Karena atribut ini berupa string, maka Anda menggunakan kata kuncissetelahnya. -
lineno: Nomor baris sumber tempat pemanggilan logging dipanggil. Karena atribut ini berupa bilangan bulat, maka Anda menggunakan kata kuncidsetelahnya. -
message: Pesan yang dicatat, dihitung sebagai msg % args. Ini disetel saat Formatter.format() dipanggil. Jika Anda tidak menentukan atribut ini saat menggunakan parameter format(), pesan yang ingin Anda catat tidak akan dihasilkan. Demikian pula, untuk atribut message, Anda menggunakanskarena berupa string. -
funcName: Ini akan menampilkan nama modul atau fungsi tempat log dihasilkan. Berguna ketika Anda memiliki banyak fungsi dalam kode dan ingin memisahkan log berdasarkan fungsi atau metode yang menaunginya.
Mari ambil contoh sederhana dan lihat bagaimana Anda dapat memasang fungsi debug logging sebagai pengganti fungsi print.
import logging
logging.basicConfig(format='%(asctime)s :: %(levelname)s :: %(funcName)s :: %(lineno)d \
:: %(message)s', level = logging.INFO)
def addition(x, y):
add = x + y
return add
def subtract(x, y):
sub = x - y
return sub
def multiply(x, y):
mul = x * y
return mul
def divide(x, y):
div = x / y
return div
def exponent(x, y):
exp = x ** y
return exp
num1 = 20
num2 = 2
def main():
add_result = addition(num1, num2)
logging.info('Add: {} + {} = {}'.format(num1, num2, add_result))
sub_result = subtract(num1, num2)
logging.info('Sub: {} - {} = {}'.format(num1, num2, sub_result))
mul_result = multiply(num1, num2)
logging.info('Mul: {} * {} = {}'.format(num1, num2, mul_result))
div_result = divide(num1, num2)
logging.info('Div: {} / {} = {}'.format(num1, num2, div_result))
exp_result = exponent(num1, num2)
logging.info('Exp: {} ** {} = {}'.format(num1, num2, exp_result))
main()
2020-03-19 00:01:27,372 :: INFO :: main :: 35 :: Add: 20 + 2 = 22
2020-03-19 00:01:27,376 :: INFO :: main :: 38 :: Sub: 20 - 2 = 18
2020-03-19 00:01:27,377 :: INFO :: main :: 41 :: Mul: 20 * 2 = 40
2020-03-19 00:01:27,378 :: INFO :: main :: 44 :: Div: 20 / 2 = 10.0
2020-03-19 00:01:27,379 :: INFO :: main :: 47 :: Exp: 20 ** 2 = 400
Kesimpulan
Selamat telah menyelesaikan tutorial ini.
Anda mungkin ingin mencoba atribut logging lainnya dan memahami bagaimana atribut tersebut dapat dimanfaatkan dalam kode Anda.
Jangan ragu untuk mengajukan pertanyaan terkait tutorial ini di kolom komentar di bawah.
Jika Anda baru mulai belajar Python dan ingin mendalami lebih jauh, ikuti kursus Introduction to Data Science in Python dari DataCamp.
