Skip to content

Latest commit

 

History

History
97 lines (69 loc) · 3.68 KB

09.Python_logging.md

File metadata and controls

97 lines (69 loc) · 3.68 KB

Giới thiệu

Cách làm việc với thư viện ghi log khi lập trình python

Cách dùng

Đầ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 dung
  • filename='/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ình
  • level=logging.DEBUG: Khai báo này để lấy mọi nội dung log từ cấp độ DEBUG trở lên
  • datefmt='%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ổ sung

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

  • 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ải
  • s 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.

Tham khảo