2011-11-25 98 views
10

我在一个简单的脚本中使用Python日志记录模块,并使用以下设置。Python只记录脚本中的日志

logging.basicConfig(format='%(asctime)s %(message)s', level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S') 
logger = logging.getLogger(__name__) 

我的问题是,这也捕获第三方模块,如请求和输出信息()他们的日志消息。有什么办法来抑制这些消息或告诉日志记录模块只记录来自我自己的脚本的消息?

回答

10

使用命名记录器在你的模块:

import logging 
logger = logging.getLogger(__name__) 
logger.info("my info") 
logger.error("my error") 

您可以设置日志级别的所有其他记录器错误,并为您记录仪调试:

import logging 
logging.basicConfig(level=logging.ERROR) 
logging.getLogger(my_module.__name__).setLevel(logging.DEBUG) 
0

以上的答案是不真的是正确的 - 它只会将来自其他模块的消息的栏设置得更高。

一个非常快速的方法是使用这段代码:

import logging.config 
logging.config.dictConfig({ 
    'version': 1, 
    'disable_existing_loggers': True, 
}) 

你必须导入所有模块后,设置此 - 这将禁用创建到这一点的所有记录。这在大多数情况下都能正常工作,但有些模块会在您创建类实例时创建它们的记录器(这将在您的代码中稍后发生)。


当你根据基本的Python教程,他们告诉你使用logging.basicConfig(...)设置记录器。这是一个问题,因为这会将处理程序(也就是日志将被路由到的位置)设置为logging.lastResort,这是全球范围内的Python 3.2开始的所有记录器的标准错误。这意味着您现在已经为所有模块启用了完整日志记录。

所以更好的方法是创建一个不同的记录器只为您的模块,并给它自己的一些处理程序,而不是使用basicConfig()

有这样做的方法有两种:

1)所有功能:

import logging 

log = logging.getLogger(__name__) 
log.setLevel(logging.DEBUG) 
formatter = logging.Formatter(fmt="%(asctime)s %(levelname)s: %(message)s", 
          datefmt="%Y-%m-%d - %H:%M:%S") 
ch = logging.StreamHandler(sys.stdout) 
ch.setLevel(logging.DEBUG) 
ch.setFormatter(formatter) 
fh = logging.FileHandler("mylog.log", "w") 
fh.setLevel(logging.DEBUG) 
fh.setFormatter(formatter) 
log.addHandler(ch) 
log.addHandler(fh) 

这会给你的记录log,然后您可以使用像log.error("Error found")。它将写入一个名为mylog.log的新文件,并且还会记录如此的sys.stdout。你可以根据自己的喜好来改变它。

2)使用的字典:

import logging 
import logging.config 

DEFAULT_LOGGING = { 
    'version': 1, 
    'formatters': { 
     'standard': { 
      'format': '%(asctime)s %(levelname)s: %(message)s', 
      'datefmt': '%Y-%m-%d - %H:%M:%S' }, 
    }, 
    'handlers': { 
     'console': {'class': 'logging.StreamHandler', 
        'formatter': "standard", 
        'level': 'DEBUG', 
        'stream': sys.stdout}, 
     'file':  {'class': 'logging.FileHandler', 
        'formatter': "standard", 
        'level': 'DEBUG', 
        'filename': 'live_detector.log','mode': 'w'} 
    }, 
    'loggers': { 
     __name__: {'level': 'INFO', 
        'handlers': ['console', 'file'], 
        'propagate': False }, 
    } 
} 

logging.config.dictConfig(DEFAULT_LOGGING) 
log = logging.getLogger(__name__) 

这将给予相同的结果上面,时间长一点,但也许更容易阅读。这会自动设定'disable_existing_loggers': True。如果你不想这样做,你必须添加它并将其设置为False。