禁用boto日志记录而不修改boto文件

时间:2009-11-02 13:15:49

标签: python logging amazon-web-services boto

我正在使用Boto库与AWS交谈。我想禁用日志记录。 (或重定向到/ dev / null或其他文件)。我找不到明显的方法来做到这一点。我尝试了这个,但这似乎没有帮助。

import boto
boto.set_file_logger('boto', 'logs/boto.log')

这说明有可能,http://developer.amazonwebservices.com/connect/thread.jspa?messageID=52727&#52727但AFAIK的文档并没有说明如何。

7 个答案:

答案 0 :(得分:72)

你可以尝试

import logging
logging.getLogger('boto').setLevel(logging.CRITICAL)

将抑制所有(CRITICAL除外)错误。

Boto使用日志记录配置文件(例如/etc/boto.cfg~/.boto),看看您是否可以按照这种方式配置它。

set_file_logger调用只是将用户定义的文件添加到日志记录设置中,因此您无法使用它来关闭注销。

答案 1 :(得分:19)

我将评论中的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)

要获取所有记录器,请按照response from leobarcellos

进行操作
import logging
loggers_dict = logging.Logger.manager.loggerDict

答案 2 :(得分:4)

更好的是,对boto:

禁用propagate
import boto
boto.set_file_logger('boto', 'logs/boto.log')
logging.getLogger('boto').propagate = False

答案 3 :(得分:3)

这是唯一的解决方案,截止到今天(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)

正在杀死我的所有非Boto日志。 它会操纵来自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()结合使用并按照我的建议进行应用。

答案 4 :(得分:2)

此答案适用于正在使用logging.config.dictConfig的用户。

建议从所有外部软件包中禁用DEBUG和INFO消息,但不限于botocoreboto3

LOGGING_CONFIG = { # Add your preexisting logging config here.
    "loggers": { # Add your preexisting loggers here.
        "": {"level": "WARNING", "handlers": ["console"], "propagate": False},  # Root logger.
     }

或者,禁用来自botocoreboto3的调试消息,但不禁用所有外部软件包的调试消息:

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导入后运行,它将无法完全正常工作。您可以选择将以上"WARNING"替换为"INFO""ERROR""CRITICAL"

答案 5 :(得分:1)

对我来说,所有发布的解决方案都无法正常运行。可能是由于boto同时发生了变化。

But sometimes a look into the manual does help..

import logging
import boto3
boto3.set_stream_logger('', logging.CRITICAL)

答案 6 :(得分:0)

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