2012-01-12 159 views
5

我想做一些我认为很简单的事情。Python中不同级别的日志记录

其实用Python记录模块,我有兴趣记录 一切从命令 行参数给出的水平在命令行上,及日志记录文件到一个固定的调试级别。

创建具有不同级别不起作用两个不同的记录器,但 设置两个不同的处理程序都添加到根 记录器也不起作用的水平,所以对我应该怎么真正做到这一点的任何想法? (阅读上的其他链接第二种方法应该工作,所以我在做别的事情愚蠢?)

这是目前建立了我的日志系统中的代码:

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

“,但设置添加到根记录器的两个不同处理程序的级别不起作用“?你能澄清一下吗? – 2012-01-12 15:48:52

回答

12

这是我使用我所有的Python命令行应用程序。这是一个有点冗长,但你应该能够得到接受一个可选的参数在任何级别创建一个控制台记录器记录器,不管的精选被记录到文件中的内容:

#!/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在命令行中,我们可以看到日志级别的差异。

-c1等同于 “调试和更高”(最详细),但company.log仍然只有登录警告及以上:

~ 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等同于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只是一个建议:如果使用'parser.add_argument'方法的'type = int'和'choices = xrange(51)'关键字,我想你可以避免定义'getConsoleLevel'函数。请参阅[本文末尾](https://docs.python.org/2/library/argparse.html#type)。你可以设置一个默认值'21',并获得与'logging'模块相同的默认级别。 – logc 2014-08-21 17:01:53

+0

@logc:感谢您的建议......我不确定为什么我以前没有这样做(也许我关心帮助声明的打印方式),但我可以看到它的工作原理也一样内置插件。谢谢 :) – 2014-08-21 21:59:02

相关问题