2012-01-12 61 views
5

Tôi muốn làm điều gì đó mà tôi nghĩ là đơn giản.Các cấp độ đăng nhập khác nhau trong python

Thực tế với mô-đun ghi trăn, tôi quan tâm đến việc ghi nhật ký mọi thứ trên dòng lệnh ở cấp được đưa ra từ các đối số dòng lệnh và đăng nhập vào một mức DEBUG cố định.

Tạo hai trình ghi nhật ký khác nhau với các mức khác nhau không hoạt động, nhưng thiết lập mức của hai trình xử lý khác nhau được thêm vào root logger không hoạt động, vì vậy bất kỳ ý tưởng nào về cách thực sự nên thực hiện? (đọc trên các liên kết khác phương pháp thứ hai nên làm việc, vì vậy tôi đang làm cái gì khác ngu ngốc?)

Đây là mã trong đó thiết lập hệ thống đăng nhập của tôi vào lúc này:

class LoggerSetup(object): 
    """Setup the different logger objects 
    """ 

    def __init__(self): 
     self.root_logger = logging.getLogger() 
     self.shell_hdlr = logging.StreamHandler() 

    #TODO: add another logging handler which stores to a temporary file 
    #which should be cleaned up later 
    def setup_shell_logger(self, log_level): 
     self.root_logger.setLevel(LOG_LEVELS[log_level]) 
     # in this way the root logger is not set but the handlers are set 
     self.shell_hdlr = logging.StreamHandler() 
     self.shell_hdlr.setLevel(LOG_LEVELS[log_level]) 
     self.shell_hdlr.setFormatter(StarFormatter()) 
     #FIXME: add the support for regular expression exclusion too 
     self.root_logger.addHandler(self.shell_hdlr) 

    def setup_log_include(self, log_include): 
     """Set up the filter to include log messages 
     """ 
     if log_include: 
      incl = FilterInclude(log_include) 
      self.shell_hdlr.addFilter(incl) 

    def setup_log_exclude(self, log_exclude): 
     """Set up the filters to exclude log messages 
     """ 
     if log_exclude: 
      excl = FilterExclude(log_exclude) 
      self.shell_hdlr.addFilter(excl) 

    def setup_file_logging(self): 
     """Set up the file logger, which always logs in DEBUG mode 
     even if the top level logger is set to another level 
     """ 
     #XXX: not working, one possible way to make it work is to create 
     #only one log, and different handler/filters to make to handle all 
     #the different outputs 
     file_handler = logging.FileHandler(LOG_FILENAME) 
     # the file logging is always in debug mode 
     file_handler.setLevel(logging.DEBUG) 
     formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s - %(asctime)s') 
     file_handler.setFormatter(formatter) 
     self.root_logger.addHandler(file_handler) 
+0

"nhưng đặt mức của hai trình xử lý khác nhau được thêm vào bộ ghi gốc không hoạt động "? Bạn có thể làm rõ, xin vui lòng? –

Trả lời

12

Đây là điều tôi đang sử dụng với tất cả các ứng dụng dòng lệnh Python của tôi. Đó là một chút dài dòng, nhưng bạn sẽ có thể để có được một logger chấp nhận một đối số tùy chọn để tạo ra một giao diện điều khiển logger ở bất kỳ cấp độ, không phụ thuộc vào những gì đang được đăng nhập vào file:

#!/usr/bin/env python 
import logging 
from argparse import ArgumentParser 

COMPANY_LOGGER = 'COMPANY.Python.Logger' 
CONSL_LEVEL_RANGE = range(0, 51) 
LOG_FILE = 'company.log' 
FORMAT_STR = '%(asctime)s %(levelname)s %(message)s' 

parser = ArgumentParser() 
parser.add_argument('-c', '--console-log', metavar='ARG', 
        type=int, choices=range(0, 51), 
        action='store', dest='console_log', 
        default=None, 
        help='Adds a console logger for the level specified in the range 1..50') 

args = parser.parse_args() 

# Create logger 
logger = logging.getLogger(COMPANY_LOGGER) 
logger.setLevel(logging.DEBUG) 
formatter = logging.Formatter(FORMAT_STR) 

# Add FileHandler and only log WARNING and higher 
fh = logging.FileHandler(LOG_FILE) 
fh.name = 'File Logger' 
fh.level = logging.WARNING 
fh.formatter = formatter 
logger.addHandler(fh) 

# Add optional ConsoleHandler 
if args.console_log: 
    ch = logging.StreamHandler() 
    ch.name = 'Console Logger' 
    ch.level = args.console_log 
    ch.formatter = formatter 
    logger.addHandler(ch) 

logger.debug('DEBUG') 
logger.info('INFO') 
logger.warning('WARNING') 
logger.critical('CRITICAL') 

Whenrun từ dòng lệnh chúng tôi có thể thấy sự khác biệt về mức độ đăng nhập.

-c1 tương đương với "DEBUG và cao hơn" (các tiết nhất), nhưng company.log vẫn chỉ đăng CẢNH BÁO và cao hơn:

~ zacharyyoung$ ./so.py -c1 
2012-01-12 08:59:50,086 DEBUG DEBUG 
2012-01-12 08:59:50,086 INFO INFO 
2012-01-12 08:59:50,087 WARNING WARNING 
2012-01-12 08:59:50,087 CRITICAL CRITICAL 

~ zacharyyoung$ cat company.log 
2012-01-12 08:59:50,087 WARNING WARNING 
2012-01-12 08:59:50,087 CRITICAL CRITICAL 

-c20 tương đương với INFO:

~ zacharyyoung$ ./so.py -c20 
2012-01-12 09:00:09,393 INFO INFO 
2012-01-12 09:00:09,393 WARNING WARNING 
2012-01-12 09:00:09,393 CRITICAL CRITICAL 

~ zacharyyoung$ cat company.log 
2012-01-12 08:59:50,087 WARNING WARNING 
2012-01-12 08:59:50,087 CRITICAL CRITICAL 
2012-01-12 09:00:09,393 WARNING WARNING 
2012-01-12 09:00:09,393 CRITICAL CRITICAL 
+0

+1 Chỉ là một gợi ý: Tôi nghĩ bạn có thể tránh định nghĩa hàm 'getConsoleLevel' nếu bạn sử dụng các từ khóa' type = int' và 'choices = xrange (51)' của phương thức 'parser.add_argument'. Xem [cuối phần này trên tài liệu] (https://docs.python.org/2/library/argparse.html#type). Và bạn có thể đặt giá trị mặc định là '21' và có cùng mức mặc định với mô đun' logging'. – logc

+0

@logc: cảm ơn vì đề xuất này ... Tôi không chắc tại sao tôi không làm điều này trước đây (có lẽ tôi đã quan tâm đến cách báo cáo trợ giúp được in), nhưng tôi có thể thấy nó hoạt động cũng như chỉ sử dụng được tích hợp sẵn. Cảm ơn bạn :) –

Các vấn đề liên quan