我正在为软件包设置记录仪。
我有一个简单的模块,可以简单地启动某些日志处理程序和格式。
- 文件处理程序
- 控制台处理程序(分为stderr和stdout)
- 我还设置了一些格式和过滤器。我在过滤器上遇到了麻烦。
- 我想有2个处理程序,一个过滤器 out info和debug消息(用于stderr stream),其他过滤器出现警告及以上(留下信息和调试)
我不确定我是否正确设置了过滤器类。我得到此错误,这对我来说不是很清楚:
TypeError: unbound method filter() must be called with STDErrFilter instance as first argument (got LogRecord instance instead)
这是我的代码,事先感谢!:
import os
import sys
import logging
import tempfile
class STDOutFilter(logging.Filter):
def filter(self, record):
return record.levelno == logging.INFO | record.levelno == logging.DEBUG
class STDErrFilter(logging.Filter):
def filter(self, record):
return not record.levelno == logging.INFO | record.levelno == logging.DEBUG
def start_logbook(log_path=None, log_formatting=None, std_formatting=None, debug=False, clear_previous=True, ):
log_level = logging.INFO if not debug else logging.DEBUG
stdout_level = logging.INFO if not debug else logging.DEBUG
logger = logging.getLogger()
logger.setLevel(log_level)
log_path = log_path
if log_path:
folder, filename = os.path.split(log_path)
if folder and not os.path.exists(folder):
raise IOError("path {0} does not exist!".format(folder))
else:
# Setup Temp Log
log_path = tempfile.NamedTemporaryFile(prefix='tempLog'+'_log_', suffix='.log')
# Add File Handlers
file_handler = logging.FileHandler(log_path)
if clear_previous:
file_handler = logging.FileHandler(log_path, mode='w')
file_formatting = logging.Formatter('[%(asctime)s] %(levelname)-8s --- %(filename)s - %(funcName)s [%(lineno)d] - %(message)s', "%Y-%m-%d %H:%M:%S")
file_handler.setFormatter(file_formatting)
# Add Console Handler
error_console_handler = logging.StreamHandler(stream=sys.stderr)
error_console_handler.setLevel(stdout_level)
error_console_handler.addFilter(STDErrFilter)
info_console_handler = logging.StreamHandler(stream=sys.stdout)
info_console_handler.setLevel(stdout_level)
info_console_handler.addFilter(STDOutFilter)
console_formatting = logging.Formatter('%(levelname)-8s --- %(message)s')
error_console_handler.setFormatter(console_formatting)
info_console_handler.setFormatter(console_formatting)
logger.addHandler(error_console_handler)
logger.addHandler(info_console_handler)
logger.addHandler(file_handler)
return {'log_filepath': os.path.abspath(log_path), 'handlers':[error_console_handler, info_console_handler, file_handler]}
if __name__ == '__main__':
info = start_logbook("test.log", debug=True)
log = logging.getLogger("Test Run")
log.debug("Debug Message goes Here")
log.info("INFO Message goes Here")
log.warning("WARNING Message goes Here")
log.error("ERROR Message goes Here")
log.critical("Critical Message goes Here")
log.exception(ValueError("Blarg"))
logging.shutdown(info['handlers'])
我知道了,愚蠢的错误。添加过滤器时,我需要在代码中实例化类,而不是传递对象实例化。
# Add Console Handler
error_console_handler = logging.StreamHandler(stream=sys.stderr)
error_console_handler.setLevel(stdout_level)
error_console_handler.addFilter(STDErrFilter()) # Problem was here I needed ()
info_console_handler = logging.StreamHandler(stream=sys.stdout)
info_console_handler.setLevel(stdout_level)
info_console_handler.addFilter(STDOutFilter()) # Problem was here! Needed ()