Cách làm việc với thư viện ghi log khi lập trình python
Đầu tiên, để có thể sử dụng các function của thử viện logging, ta cần phải import nó bằng dòng sau:
import logging
Để kiểm tra các thư viện đã được tải, ta sử dụng lệnh dir()
# python
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'datetime', 'json', 'os', 'sys', 'threading', 'time']
Muốn thoát ra khỏi trình biên dịch python thì sử dụng lệnh quit()
Còn muốn xoá thư viện vừa được import vào thì sử dụng lệnh del
del logging
Sau đó, ta thiết lập một cấu hình để việc ghi log được thực thi.
logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', filename='/var/log/testlog.log',level=logging.DEBUG, datefmt='%Y-%m-%d %H:%M:%S')
Giải thích dòng trên.
format='%(asctime)s %(levelname)s %(message)s'
: đây là đoạn quy định cấu trúc của dòng log khi được ghi lại, thời gian, cấp độ và nội dungfilename='/var/log/testlog.log'
: Yêu cầu ghi các nội dung vào tập tin/var/log/backup.log
. Nếu ko thì mặc định sẽ xuất ra màn hìnhlevel=logging.DEBUG
: Khai báo này để lấy mọi nội dung log từ cấp độ DEBUG trở lêndatefmt='%Y-%m-%d %H:%M:%S'
: định dạng time ở dòng log sẽ được ghi theo định dạng năm-tháng-ngày giờ-phút-giây
Ta thử viết một chương trình đơn giản như sau:
import logging
import time
def main():
logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', filename='/var/log/testlog.log',level=logging.DEBUG, datefmt='%Y-%m-%d %H:%M:%S')
info = {'stop': False}
while True:
try:
logging.debug('Hello from main')
time.sleep(0.75)
except KeyboardInterrupt:
info['stop'] = True
break
if __name__ == '__main__':
main()
Kết quả chạy sẽ được ghi ra file /var/log/testlog.log
như sau:
2019-04-03 21:25:18 DEBUG Hello from main
2019-04-03 21:25:19 DEBUG Hello from main
2019-04-03 21:25:20 DEBUG Hello from main
Nếu trong dòng logging.basicConfig
mà tôi thay level=logging.DEBUG
thành level=logging.INFO
thì sẽ không có dòng log nào được ghi vào file do ta quy định
chỉ những log có level từ info mới được ghi vào.
Mức debug là mức thấp nhất trong các cấp độ log: DEBUG INFO WARNING ERROR CRITICAL
Bạn có thể quy định các cách thức ghi log khác nhau với khai báo format
:
format='%(relativeCreated)6d %(threadName)s %(message)s'
format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s'
format='%(relativeCreated)5d %(name)-15s %(levelname)-8s %(message)s'
format='%(asctime)-15s %(name)-5s %(levelname)-8s IP: %(ip)-15s User: %(user)-8s %(message)s'
format='%(message)s'
Giải thích một chút các con số như 6d
, 8s
là
d
quy định cho định dạng số; 6d tức là 6 số, nếu có dấu-
là sẽ căn lề phảis
quy định số lượng ký tự. nếu có dấu-
là sẽ căn lề phải
Logging còn có nhiều cách thức sử dụng khác nữa. Tôi sẽ tìm hiểu thêm.