错误后更改其自己的日志级别的python记录器

时间:2018-08-17 16:51:06

标签: python python-2.7 logging

我尝试在此处编写一个脚本,该脚本支持流和文件处理程序的不同日志级别。最初,我将流处理程序的日志级别设置为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

我确定这是一个愚蠢的错误,但是还有其他人知道为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

似乎有些东西正在调用mount,这将为根记录器设置logging.basicConfig(),并解释您所看到的内容。

StreamHandler调用是显式的,而不是您调用的代码中的某处(不一定是上面代码段中显示的内容),或者是通过意外调用basicConfig() [或类似名称]而不是logging.debug(...) [或类似]。