如何仅将特定内容记录到日志文件?

时间:2019-03-31 11:09:03

标签: python python-3.x multithreading logging

我正在研究Web抓取,我应该抓取多个URL。我正在使用ThreadPoolExecutor来完成任务。

我也想实现登录。我只想将特定的调试或信息或警告语句写入日志文件。但是实际上它正在将每个请求写入日志文件。

如何做到只将用logging.infologging.warning等提及的特定语句写入文件。

这是我的代码段:

logging.basicConfig(filename='BOM.log', filemode='w', format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug('Logger initiated')

with ThreadPoolExecutor(max_workers=100) as executor:
    startt = time.time()
    futures = [executor.submit(get_movie_details, movie_id) for movie_id in all_movies_ids]
    for result in as_completed(futures):
        all_movies_summary_data.append(result)
    endt = time.time()
    print("Time Taken: {:.6f}s".format(endt - startt))

这是日志文件的样子:

2019-03-31 16:21:04,722 - DEBUG - Logger initiated
2019-03-31 16:21:04,731 - DEBUG - Starting new HTTPS connection (1): www.boxofficemojo.com:443
2019-03-31 16:21:04,733 - DEBUG - Starting new HTTPS connection (2): www.boxofficemojo.com:443
2019-03-31 16:21:04,736 - DEBUG - Starting new HTTPS connection (3): www.boxofficemojo.com:443
.
.
.

如何确保仅在日志文件中启动了Logger,而没有其余部分。为什么我未在日志文件中明确提及将日志记录在任何地方,但为什么我在日志文件中得到了额外的内容。

我在记录日志方面看起来完全错误吗?请帮帮我。

我尝试按照 glhr 在其中一个答案中建议的设置日志级别

但是它给出了这样的输出。

2019-03-31 17:07:29,817 - INFO - Logger initiated
2019-03-31 17:07:30,981 - WARNING - Connection pool is full, discarding connection: www.boxofficemojo.com
2019-03-31 17:07:30,994 - WARNING - Connection pool is full, discarding connection: www.boxofficemojo.com
2019-03-31 17:07:30,997 - WARNING - Connection pool is full, discarding connection: www.boxofficemojo.com

2 个答案:

答案 0 :(得分:2)

logging.basicConfig配置其他记录器从其继承的 root 记录器。

因此,使用此方法设置的日志记录配置将应用于其他模块进行的日志记录,因此,日志文件中的其他日志行也将出现。

为了只记录您的消息:

(改编自https://docs.python.org/3/howto/logging.html#logging-advanced-tutorial

import logging

# create logger
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)

# create file handler and set level to INFO
file_handler = logging.FileHandler('BOM.log')
file_handler.setLevel(logging.INFO)
logger.addHandler(file_handler)

# 'application code'
logger.debug('not shown in log file')
logger.info('info message in log file')
logger.warning('warning message in log file')
logger.error('error message in log file')

结果BOM.log

info message in log file
warning message in log file
error message in log file

答案 1 :(得分:1)

basicConfig中指定日志记录级别:

logging.basicConfig(level=logging.INFO, filename='BOM.log', format=...
logging.info('Logger initiated')

这将忽略不及INFO严重的日志消息。