Hướng dẫn python logging username - tên người dùng ghi nhật ký python

Mình thấy bài này khá hay và hữu ích nên share lại từ bài gốc của tác giả dangsonbk. Bạn có thể đọc thêm series Python cơ bản thường sử dụng trong công việc của tác giả Võ Duy Tuấn nữa nhé, rất hữu ích!

Nội dung chính

  • Sử dụng logging trong Python
  • Sử dụng module logging cơ bản
  • Log ra nhiều nguồn cùng lúc
  • In nội dung biến
  • Format nội dung và thêm các thông tin chi tiết về log
  • Logging trong exception (in thông tin Traceback)
  • Sử dụng logging trong nhiều module
  • Tham khảo:

Sử dụng logging trong Python

Sử dụng module logging cơ bản

try:
    print("Find PID in current url")
    wait.until(lambda mydriver: "{}".format(PID) in mydriver.current_url)
except:
    print("Could not find PID in url")
    print("Current url: {}".format(mydriver.current_url))
    mydriver.find_element_by_xpath('//select[@id="aex-view-3"]/option[text()="Vietnam"]').click()
    mydriver.find_element_by_xpath('//button[@id="create-profile-submit-btn"]').click()

Log ra nhiều nguồn cùng lúc

In nội dung biến

Format nội dung và thêm các thông tin chi tiết về log

Logging trong exception (in thông tin Traceback)

  • Sử dụng logging trong nhiều module
  • Tham khảo:
  • Thói quen của mình và có lẽ cũng là thói quen của nhiều người lúc mới học Python cũng như khi viết những script nhỏ để lấy thông tin chương trình lúc runtime đó là sử dụng
    # source: https://docs.python.org/3.6/howto/logging.html#a-simple-example
    import logging
    logging.warning('Watch out!')  # sẽ in ra warning trên console
    logging.info('I told you so')  # không in gì cả
    
    5,
    # source: https://docs.python.org/3.6/howto/logging.html#a-simple-example
    import logging
    logging.warning('Watch out!')  # sẽ in ra warning trên console
    logging.info('I told you so')  # không in gì cả
    
    5 ở bất cứ đâu và bất cứ khi nào. Thường thì chương trình sẽ có nhiều lệnh print như thế này:
  • Tuy nhiên khi chương trình lớn dần lên, một vấn đề khá đau đầu nảy sinh đó là thông tin được print ra khá điên loạn, không được phân loại, mất thời gian xác định cũng như giảm hiệu suất của chương trình. Hàm print mặc định sẽ xuất nội dung ra stdout và nội dung log in ra thường rất hay bị nhầm với dữ liệu khác.
  • Giải pháp mình muốn giới thiệu trong bài viết này đó là sử dụng module logging. Đây là module tiêu chuẩn (được pack kèm bộ cài mặc định) do cộng đồng Python phát triển, dễ dàng sử dụng và cực kỳ linh hoạt. Logging cung cấp cho lập trình viên những tiện ích như:

Sử dụng module logging cơ bản

Log ra nhiều nguồn cùng lúc

# source: https://docs.python.org/3.6/howto/logging.html#a-simple-example
import logging
logging.warning('Watch out!')  # sẽ in ra warning trên console
logging.info('I told you so')  # không in gì cả

In nội dung biến

import logging
logging.basicConfig(level=logging.DEBUG)
logging.warning('Watch out!')  # sẽ in ra warning trên console
logging.info('I told you so')  # sẽ in ra warning trên console

Format nội dung và thêm các thông tin chi tiết về log

import logging
logging.basicConfig(filename='example.log',level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')

Logging trong exception (in thông tin Traceback)

DEBUG:root:This message should go to the log file
INFO:root:So should this
WARNING:root:And this, too

Sử dụng logging trong nhiều module

Tham khảo:

# source: https://code.tutsplus.com/tutorials/error-handling-logging-in-python--cms-27932
import logging

# initialize the log settings
logging.basicConfig(filename='app.log',level=logging.INFO)

try:
    logging.info('Trying to open the file')
    filePointer = open('appFile','r')
    try:
        logging.info('Trying to read the file content')
        content = filePointer.readline()
    finally:
        filePointer.close()
except IOError as e:
    logging.error('Error occurred ' + str(e))

Log ra nhiều nguồn cùng lúc

In nội dung biến

# source: https://www.smartfile.com/blog/what-is-good-logging-in-python/
import logging

# create the logging instance for logging to file only
logger = logging.getLogger('SmartfileTest')

# create the handler for the main logger
file_logger = logging.FileHandler('smartfile_test.log')
NEW_FORMAT = '[%(asctime)s] - [%(levelname)s] - %(message)s'
file_logger_format = logging.Formatter(NEW_FORMAT)

# tell the handler to use the above format
file_logger.setFormatter(file_logger_format)

# finally, add the handler to the base logger
logger.addHandler(file_logger)

# remember that by default, logging will start at 'warning' unless
# we set it manually
logger.setLevel(logging.DEBUG)

# log some stuff!
logger.debug("This is a debug message!")
logger.info("This is an info message!")
logger.warning("This is a warning message!")

Format nội dung và thêm các thông tin chi tiết về log

# source: https://www.smartfile.com/blog/what-is-good-logging-in-python/
# now we can add the console logging
console = logging.StreamHandler()
console.setLevel(logging.INFO)
logging.getLogger('SmartfileTest').addHandler(console)

Logging trong exception (in thông tin Traceback)

In nội dung biến

Format nội dung và thêm các thông tin chi tiết về log

>>> import logging
>>> logString = "Hi"
>>> logging.warning('%s, this i a %s', logString, 'warning!')
WARNING:root:Hi, this i a warning!

Logging trong exception (in thông tin Traceback)

Format nội dung và thêm các thông tin chi tiết về log

Logging trong exception (in thông tin Traceback)

Sử dụng logging trong nhiều module

import logging
logging.basicConfig(level=logging.DEBUG, filename='runtime.log', filemode='w', format = (
                                                    '%(levelname)s:\t'
                                                    '%(filename)s:'
                                                    '%(funcName)s():'
                                                    '%(lineno)d\t'
                                                    '%(message)s'
                                                )
                    )

Tham khảo:

# source: https://docs.python.org/3.6/howto/logging.html#a-simple-example
import logging
logging.warning('Watch out!')  # sẽ in ra warning trên console
logging.info('I told you so')  # không in gì cả
0

Thói quen của mình và có lẽ cũng là thói quen của nhiều người lúc mới học Python cũng như khi viết những script nhỏ để lấy thông tin chương trình lúc runtime đó là sử dụng

# source: https://docs.python.org/3.6/howto/logging.html#a-simple-example
import logging
logging.warning('Watch out!')  # sẽ in ra warning trên console
logging.info('I told you so')  # không in gì cả
5,
# source: https://docs.python.org/3.6/howto/logging.html#a-simple-example
import logging
logging.warning('Watch out!')  # sẽ in ra warning trên console
logging.info('I told you so')  # không in gì cả
5 ở bất cứ đâu và bất cứ khi nào. Thường thì chương trình sẽ có nhiều lệnh print như thế này:

Logging trong exception (in thông tin Traceback)

Sử dụng logging trong nhiều module

# source: https://docs.python.org/3.6/howto/logging.html#a-simple-example
import logging
logging.warning('Watch out!')  # sẽ in ra warning trên console
logging.info('I told you so')  # không in gì cả
1

Thông tin in ra:

# source: https://docs.python.org/3.6/howto/logging.html#a-simple-example
import logging
logging.warning('Watch out!')  # sẽ in ra warning trên console
logging.info('I told you so')  # không in gì cả
2

Bạn cũng có thể gọi

import logging
logging.basicConfig(level=logging.DEBUG)
logging.warning('Watch out!')  # sẽ in ra warning trên console
logging.info('I told you so')  # sẽ in ra warning trên console
8, có chức năng tương đương với
import logging
logging.basicConfig(level=logging.DEBUG)
logging.warning('Watch out!')  # sẽ in ra warning trên console
logging.info('I told you so')  # sẽ in ra warning trên console
9.

Sử dụng logging trong nhiều module

chi tiết

Nếu phần mềm của bạn có nhiều modules thì đây là một cách đơn giản để setup hệ thống logging xuyên suốt cả phần mềm:

# source: https://docs.python.org/3.6/howto/logging.html#a-simple-example
import logging
logging.warning('Watch out!')  # sẽ in ra warning trên console
logging.info('I told you so')  # không in gì cả
3

Kết quả:

# source: https://docs.python.org/3.6/howto/logging.html#a-simple-example
import logging
logging.warning('Watch out!')  # sẽ in ra warning trên console
logging.info('I told you so')  # không in gì cả
4

Kết hợp với việc format nội dung logging như đã nêu trước đó, bạn có thể in ra thông tin log được gọi từ module nào.

Trên đây là khái quát một số ví dụ đơn giản sử dụng logging, bạn có thể khám phá thêm một số tính năng phức tạp hơn của logging ở: advanced logging tutorial

Tham khảo:

  • Python for Dummies: Log sao cho đúng
  • Logging HOWTO
  • What is Good Logging in Python?
  • Good logging practice in Python