我正在使用 Boto 库与 AWS 交谈。我想禁用日志记录。(或重定向到 /dev/null 或其他文件)。我找不到明显的方法来做到这一点。我试过这个,但这似乎没有帮助:
import boto
boto.set_file_logger('boto', 'logs/boto.log')
这说明这是可能的,http://developer.amazonwebservices.com/connect/thread.jspa ?messageID=52727췷但据我所知,文档并没有说明如何。
我正在使用 Boto 库与 AWS 交谈。我想禁用日志记录。(或重定向到 /dev/null 或其他文件)。我找不到明显的方法来做到这一点。我试过这个,但这似乎没有帮助:
import boto
boto.set_file_logger('boto', 'logs/boto.log')
这说明这是可能的,http://developer.amazonwebservices.com/connect/thread.jspa ?messageID=52727췷但据我所知,文档并没有说明如何。
你可以试试
import logging
logging.getLogger('boto').setLevel(logging.CRITICAL)
这将抑制所有(除了 CRITICAL)错误。
Boto 使用日志记录配置文件(例如/etc/boto.cfg
, ~/.boto
),所以看看您是否可以按照您的需要配置它。
该set_file_logger
调用只是将用户定义的文件添加到日志记录设置中,因此您不能使用它来关闭日志记录。
我将 boto3 答案从评论(即 charneykaye 和gene_wood)移至正确答案:
import logging
logger = logging.getLogger()
logger.addHandler(logging.StreamHandler()) # Writes to console
logger.setLevel(logging.DEBUG)
logging.getLogger('boto3').setLevel(logging.CRITICAL)
logging.getLogger('botocore').setLevel(logging.CRITICAL)
logging.getLogger('s3transfer').setLevel(logging.CRITICAL)
logging.getLogger('urllib3').setLevel(logging.CRITICAL)
import boto3
s3 = boto3.resource('s3')
for bucket in s3.buckets.all():
print(bucket.name)
要获取所有记录器,请遵循leobarcellos 的响应:
import logging
loggers_dict = logging.Logger.manager.loggerDict
更好的是,禁用propagate
boto:
import boto
boto.set_file_logger('boto', 'logs/boto.log')
logging.getLogger('boto').propagate = False
这是截至今天(2020 年 1 月 31 日)对我有用的唯一解决方案:
for name in ['boto', 'urllib3', 's3transfer', 'boto3', 'botocore', 'nose']:
logging.getLogger(name).setLevel(logging.CRITICAL)
logger = logging.getLogger(__name__)
解决方案
boto3.set_stream_logger('', logging.CRITICAL)
正在杀死我的整个非博托日志。它从 python 操作标准日志记录的根记录器。
自己试试吧:
import logging
import boto3
import sys
logger = logging.getLogger(__name__)
boto3.set_stream_logger('', logging.CRITICAL)
logging.basicConfig(level=logging.DEBUG, stream=sys.stdout,
format='%(asctime)s - %(levelname)s - %(message)s')
if __name__ == '__main__':
s3_client = boto3.client('s3')
response = s3_client.list_buckets()
logger.info(f'bucket list: {response}')
无论发生在哪里logger
,它都不会产生输出。去掉 的那一行,boto3.set_stream_logger('', logging.CRITICAL)
非boto3的日志又会重新出现!因此,唯一可行的解决方案是不要boto3.set_stream_logger()
按照我的建议使用该方法并应用它。
这个答案适用于那些正在使用logging.config.dictConfig
.
建议禁用来自所有外部包的 DEBUG 和 INFO 消息,不限于botocore
和boto3
:
LOGGING_CONFIG = { # Add your preexisting logging config here.
"loggers": { # Add your preexisting loggers here.
"": {"level": "WARNING", "handlers": ["console"], "propagate": False}, # Root logger.
}
或者,要禁用来自所有外部包的调试消息botocore
,boto3
但不禁用来自所有外部包的调试消息:
LOGGING_CONFIG = { # Add your preexisting config here too.
"loggers": { # Add your preexisting loggers here too.
"botocore": {"level": "WARNING", "handlers": ["console"], "propagate": False},
"boto3": {"level": "WARNING", "handlers": ["console"], "propagate": False},
}
假设您的日志记录配置字典已命名LOGGING
,请运行以下命令:
logging.config.dictConfig(LOGGING)
以上必须在boto3导入前运行,不管是直接导入还是间接导入!如果在 boto3 已经导入后运行,它不会完全工作。您可以选择用or或替换"WARNING"
上面的内容。"INFO"
"ERROR"
"CRITICAL"
请注意,此解决方案还将禁用非 boto 日志。请参阅mchlfchr 的答案。
对我来说,不幸的是,发布的解决方案都没有奏效。可能是由于同时 boto 本身的变化。
import logging
import boto3
boto3.set_stream_logger('', logging.CRITICAL)
python 中的日志记录模块还有另一个令人讨厌的属性:如果在为代码设置日志级别之后再次导入日志记录(例如,因为从导入日志记录的文件中导入函数),设置级别可能没有任何效果。我不知道为什么会这样的确切细节,但我只是在实现如下所示之后才设法为导入的库设置正确的日志级别,并且总是使用由该函数创建的记录器。定义此记录器创建函数的文件是我的代码库中唯一导入记录的文件。
import logging
def get_logger_by_name(logger_name: str, log_filepath: str = "/training.log") -> logging.Logger:
"""
Function that reloads logging module to store logs into a file and creates logger
:param logger_name: Name of the logger that is returned
:param log_filepath: filepath to log_file to store all logs
:return: logger object
"""
reload(
logging
) # we need to import logging again to configure log file. https://stackoverflow.com/a/53553516/11758585
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s %(levelname)-8s %(name)-10s %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
handlers=[logging.FileHandler(log_filepath), logging.StreamHandler()],
)
logger = logging.getLogger(logger_name)
logger.setLevel(logging.DEBUG)
# clean messy log output by setting log level to WARNING for unimportant loggers
logging.getLogger("botocore").setLevel(logging.WARNING)
logging.getLogger("boto3").setLevel(logging.WARNING)
logging.getLogger("boto").setLevel(logging.WARNING)
logging.getLogger("s3transfer").setLevel(logging.WARNING)
return logger
如果您正在处理 boto3,则可以通过在basicConfig中设置一般日志记录级别来完成。在下面的示例中,我们尝试检查 S3 服务的存储桶中是否存在文件:
import boto3
import botocore
import logging
logging.basicConfig(..., level=logging.INFO) # ***** HERE IS THE SOLUTION *****
s3 = boto3.resource('s3', ...) # credetials
my_bucket = s3.Bucket('bucket_name')
logging.info('INFO TEST')
logging.error('ERROR TEST')
logging.warning('WARNING TEST')
try:
my_bucket.Object('test/test.txt').load() # it will send some https requests and DEBUG them in logging
except botocore.exceptions.ClientError as e:
if e.response['Error']['Code'] == "404":
print('The object does not exist.')
else:
print('The object does exist.')
如果您希望禁用 boto 和/或其他记录器,因为您的代码生成的日志与其他模块的调试日志相比显得臃肿,您可以避免使用根记录器。
不是用 导入logging.getLogger()
,而是用 导入logging.getLogger('module_name')
。
参考官方 boto3 github repo 上的一个问题的评论。