web-dev-qa-db-ja.com

botoファイルを変更せずにbotoロギングを無効にする

AWSとの対話にBotoライブラリーを使用しています。ロギングを無効にしたい。 (または/ dev/nullまたはその他のファイルにリダイレクトします)。これを行う明確な方法が見つかりません。私はこれを試しましたが、それは役に立たないようです。

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

これはそれが可能であると言います http://developer.amazonwebservices.com/connect/thread.jspa?messageID=52727&#52727 しかし、ドキュメントにはその方法が記載されていません。

45
agiliq

あなたは試すことができます

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

すべての(クリティカル以外の)エラーを抑制します。

Botoはロギング構成ファイルを使用します(例:/etc/boto.cfg~/.boto)それで、ニーズに合わせて構成できるかどうか確認してください。

set_file_logger呼び出しは、ユーザー定義ファイルをログ設定に追加するだけなので、ログをオフにするためにそれを使用することはできません。

80
Vinay Sajip

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
24
lony

さらに良いことに、botoのpropagateを無効にします。

import boto
boto.set_file_logger('boto', 'logs/boto.log')
logging.getLogger('boto').propagate = False
7
Doug Harris

これが唯一の解決策であり、今日(2020/01/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ログが再び表示されます。その結果、唯一の実用的な解決策は[〜#〜] not [〜#〜]であり、boto3.set_stream_logger()でアプローチを使用して、提案したように適用します。

2
mchlfchr

UPDATE 09/02/2020:

このソリューションは非botoログも無効にすることに注意してください。代わりに mchlfchr's answer を参照してください。


私にとって、残念なことに投稿された解決策はどれも機能しませんでした。おそらくboto自体の変更が原因です。

しかし、マニュアルを参照すると役立つ場合があります。

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