Chủ Nhật, 15 tháng 12, 2013

Kỹ thuật LOGGING

Kỹ thuật LOGGING <P2>


Bổ xung hơn các kiến thức thực tế về Logging, bài trước chỉ mang tính lý thuyết

Logging tutorial


Các từ khóa quan trọng của Logging API được cung cấp bởi một thư viện chuẩn Python. Thư viện chuẩn Python hỗ trợ cho việc viết các log messages to file, HTTP GET/POST locations, Email via SMTP, generic Socket, hoặc OS- specific logging mechansms. Hoặc bạn có thể tạo ra các  log destination class cho riêng mình với các điều kiện cụ thể mà các built-in classes không có

Để quản lý nhiều hơn size file, bạn có thể sử dụng RotatingFileHandler:

import glob
import logging
import logging.handlers

LOG_FILENAME = 'logging_rotatingfile_example.out'

# Set up a specific logger with our desired output level
my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)

# Add the log message handler to the logger
handler = logging.handlers.RotatingFileHandler(
              LOG_FILENAME, maxBytes=20, backupCount=5)

my_logger.addHandler(handler)

# Log some messages
for i in range(20):
    my_logger.debug('i = %d' % i)

# See what files are created
logfiles = glob.glob('%s*' % LOG_FILENAME)

for filename in logfiles:
    print(filename)

 kết quả sẽ hiện ra 6 file, hiển thị các phần log history của applicaticon
logging_rotatingfile_example.out
logging_rotatingfile_example.out.1
logging_rotatingfile_example.out.2
logging_rotatingfile_example.out.3
logging_rotatingfile_example.out.4
logging_rotatingfile_example.out.5

The most current file sẽ là LOG_FILENAME
Mỗi lần nó tách size limit thì file sẽ được đổi tên với suffix là ".i"
maxBytes dùng để giới hạn size của file

Tính năng useful khác của logging là hiển thì các log messages khác nhau trong các level khác nhau.

import logging
import sys

LEVELS = {'debug': logging.DEBUG,
          'info': logging.INFO,
          'warning': logging.WARNING,
          'error': logging.ERROR,
          'critical': logging.CRITICAL}

if len(sys.argv) > 1:
    level_name = sys.argv[1]
    level = LEVELS.get(level_name, logging.NOTSET)
    logging.basicConfig(level=level)

logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical error message')
 

chạy file trên ở level Debug hoặc Info thì các log message sẽ hiện ra khác nhau như sau:
$ python logging_level_example.py debug
DEBUG:root:This is a debug message
INFO:root:This is an info message
WARNING:root:This is a warning message
ERROR:root:This is an error message
CRITICAL:root:This is a critical error message

$ python logging_level_example.py info
INFO:root:This is an info message
WARNING:root:This is a warning message
ERROR:root:This is an error message
CRITICAL:root:This is a critical error message
 
Các bạn thấy rằng, trong mỗi log messages đều có root , Và bạn có thể thay đổi được điều này.
Hãy xem một ví dụ log từ các module khác nhau để dễ dàng phát hiện ra file nguồn của các messages:

import logging

logging.basicConfig(filename = 'hehe.log', filemode = 'w', level=logging.WARNING)
logger1 = logging.getLogger('package1.module1')
logger2 = logging.getLogger('package2.module2')

logger1.warning('This message comes from one module')
logger2.warning('And this message comes from another module')

kết quả output:
 
$ python logging_modules_example.py
WARNING:package1.module1:This message comes from one module
WARNING:package2.module2:And this message comes from another module
  
trong file có tên "hehe.log"





1 nhận xét:

  1. bài này viết về logrotate à ?
    mặc dù ko dùng nhiều nhưng cũng là 1 thứ nên biết.

    Trả lờiXóa