我尝试在此处编写一个脚本,该脚本支持流和文件处理程序的不同日志级别。最初,我将流处理程序的日志级别设置为ERROR,将文件设置为INFO,但是,在出现第一个错误之后,流处理程序将以DEBUG级别而不是我指定的格式进行报告。似乎它以某种方式创建了一个新的流处理程序?因为现在将复制先前在流处理程序指定级别的将来日志记录。这是我的代码的相关部分:
args = parser.parse_args()
s = args.source
d = args.destination
group = args.group
debug = args.debug
interactive = args.interactive
def set_log_level_from_verbose(args, l):
if not args.verbose:
l.setLevel(logging.ERROR)
elif args.verbose == 1:
l.setLevel(logging.WARNING)
elif args.verbose == 2:
l.setLevel(logging.INFO)
elif args.verbose >= 2:
l.setLevel(logging.DEBUG)
else:
l.critical("UNEXPLAINED NEGATIVE VERBOSITY COUNT!")
logger = logging.getLogger('DOIT_DATA_PROMOTION')
logger.setLevel(logging.DEBUG)
# create a console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
set_log_level_from_verbose(args, ch)
# add log message handler to the logger
fh = logging.handlers.TimedRotatingFileHandler('DOIT_DATA_PROMOTION.log', when='midnight', backupCount=5)
fh.setLevel(logging.INFO)
# create formatter and add it to the handlers
fmt = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
fmt1 = logging.Formatter('%(levelname)s - %(message)s')
fh.setFormatter(fmt)
ch.setFormatter(fmt1)
# Add handers to the logger
logger.addHandler(ch)
logger.addHandler(fh)
logger.info("\n++++++++++++++++ Start Operations ++++++++++++++++")
logger.error("Sample ERROR")
logger.info("New INFO")
在未设置args.verbose的情况下运行此命令,此时将显示控制台输出
ERROR - Sample ERROR
INFO:DOIT_DATA_PROMOTION:NewInfo
我确定这是一个愚蠢的错误,但是还有其他人知道为什么会这样吗?
答案 0 :(得分:0)
似乎有些东西正在调用mount
,这将为根记录器设置logging.basicConfig()
,并解释您所看到的内容。
StreamHandler
调用是显式的,而不是您调用的代码中的某处(不一定是上面代码段中显示的内容),或者是通过意外调用basicConfig()
[或类似名称]而不是logging.debug(...)
[或类似]。