import logging
import datetime
import requests
import warnings
def log_file(log_name):
log_day = datetime.datetime.now().strftime('%d-%m-%Y')
log_name = '/sample1/log_basics/' + log_day + "_" + log_name
return log_name
logging.basicConfig(filemode='a', format='%(asctime)s:%(levelname)s:%(message)s',level=logging.DEBUG)
i = "_developertest_log"
logger = logging.getLogger(i)
logger.propagate=False
log_name = i + ".log"
handler = logging.FileHandler(log_file(log_name))
handler.setLevel(logging.DEBUG)
handler.setFormatter(logging.Formatter('%(asctime)s:%(levelname)s:%(message)s'))
logger.addHandler(handler)
def process2(abc):
print("Going to check: "+str(abc))
logger.info("Going to check test1: "+str(abc))
x = requests.get('https://w3schools.com/python/demopage.htm')
print(x.text)
abc = "68485"
process2(abc)
是否有任何解决方案可以在日志文件中添加 """2024-04-02 11:42:05,369:DEBUG:Starting new HTTPS connection (1): w3schools.com:443""" 调试行并且不需要显示日志输出控制台中的行
这不起作用的原因是多方面的:当您为
logging.basicConfig
指定“文件模式”时,您永远不会告诉根记录器写入任何文件。实际上,这甚至不是一个错误(除了在不需要时设置文件模式之外),因为以这种方式使用根记录器作为记录器被认为不是很好的做法。但是,您使用 logger
创建的 logger = logging.getLogger(i)
与 requests
模块无关,因此仅处理对 logger.info("...")
的手动调用,而来自请求模块(实际上是其中的 urllib3)的日志消息是由根记录器处理,您已告诉根记录器通过标准 StreamHandler
使用您的:logging.basicConfig(filemode='a', format='%(asctime)s:%(levelname)s:%(message)s',level=logging.DEBUG)
. 显示调试级别消息
所以你需要理清一些复杂的事情。您这里有很多选择,但让我给您一个简单的选择:
相关行:
# 1. create a handler and set its filemode to append
handler = logging.FileHandler(log_file(log_name),mode='a')
handler.setFormatter(logging.Formatter('%(asctime)s:%(levelname)s:%(message)s'))
# 2. create a logger that you'll use as you please
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(handler)
# 3. create a logger that captures the requests modules log messages
requests_logger = logging.getLogger("urllib3")
requests_logger.setLevel(logging.DEBUG)
requests_logger.addHandler(handler)
请注意,从技术上讲,您可以不使用
logger
并使用 requests_logger
代替“logger.info("Going to check test1...”,但我个人发现最好区分直接来自模块和您在代码中手动设置的消息。此外,如果您想区分日志文件中的这些消息,您又有很多选择 - 例如:
调整您的格式化程序以包含消息源自的路径名:
handler.setFormatter(logging.Formatter('%(路径名)s:%(asctime)s:%(levelname)s:%(消息)s'))
或者,为您需要的每个记录器创建具有不同格式化程序的不同处理程序并写入同一文件(然后将正确的处理程序添加到相应的记录器)
或者,写入您设置的每个记录器的特定日志文件