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

agi*_*liq 43 python logging boto amazon-web-services

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

import boto
boto.set_file_logger('boto', 'logs/boto.log')
Run Code Online (Sandbox Code Playgroud)

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

Vin*_*jip 76

你可以试试

import logging
logging.getLogger('boto').setLevel(logging.CRITICAL)
Run Code Online (Sandbox Code Playgroud)

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

宝途使用日志配置文件(例如/etc/boto.cfg,~/.boto),所以看看你是否可以将其配置为您的需求的方式.

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

  • 使用boto3,我不得不`logging.getLogger('botocore').setLevel(logging.INFO)` (24认同)
  • 正如@charneykaye和@Gerard上面提到的,因为`boto3`实际上是两个不同的模块,`boto3`和`botocore`,你需要用这样的两个调用来抑制它们:`logging.getLogger('botocore'). setLevel(logging.CRITICAL)`和`logging.getLogger('boto3').setLevel(logging.CRITICAL))` (18认同)
  • 我用了; logging.getLogger( 'boto3').setLevel(logging.CRITICAL) (3认同)

lon*_*ony 22

我将评论中的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)
Run Code Online (Sandbox Code Playgroud)

要获得所有记录器,请遵循leobarcellos响应:

import logging
loggers_dict = logging.Logger.manager.loggerDict
Run Code Online (Sandbox Code Playgroud)

  • DEBUG 是默认设置,boto3 日志级别以仅显示关键错误和更高错误的方式进行更改,因为默认的 boto3 消息较低 - 我假设是信息或调试 - 它们不再显示。有帮助吗? (2认同)

Acu*_*nus 7

此答案适用于那些正在使用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.
     }
Run Code Online (Sandbox Code Playgroud)

或者,要禁用来自所有外部包的调试消息,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},
     }
Run Code Online (Sandbox Code Playgroud)

假设您的日志记录配置字典名为LOGGING,接下来运行:

logging.config.dictConfig(LOGGING)
Run Code Online (Sandbox Code Playgroud)

以上必须在导入boto3之前运行,无论是直接导入还是间接导入!如果在 boto3 已经导入之后运行它就不会完全工作。您可以选择将"WARNING"上面替换为"INFO""ERROR""CRITICAL"


mch*_*chr 6

这是唯一的解决方案,截至今天(2020/01/31)对我有用:

for name in ['boto', 'urllib3', 's3transfer', 'boto3', 'botocore', 'nose']:
    logging.getLogger(name).setLevel(logging.CRITICAL)
logger = logging.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)

解决方案与

boto3.set_stream_logger('', logging.CRITICAL)
Run Code Online (Sandbox Code Playgroud)

正在杀死我的整个非 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}')
Run Code Online (Sandbox Code Playgroud)

无论 initlogger发生在哪里,它都不会显示输出。去掉那一行,boto3.set_stream_logger('', logging.CRITICAL)非boto3的日志又会重新出现!因此,唯一可行的解​​决方案是不要boto3.set_stream_logger()按照我的建议使用该方法并应用它。


Dou*_*ris 5

更好的是,禁用propagateboto:

import boto
boto.set_file_logger('boto', 'logs/boto.log')
logging.getLogger('boto').propagate = False
Run Code Online (Sandbox Code Playgroud)