I am using the Boto library to talk to AWS. I want to disable logging. (Or redirect to /dev/null or other file). I cant find an obvious way to do this. I tried this, but tha
Better yet, disable propagate
for boto:
import boto
boto.set_file_logger('boto', 'logs/boto.log')
logging.getLogger('boto').propagate = False
UPDATE Feb 2020:
Beware this solution will disable also non-boto logs. See mchlfchr's answer instead.
For me none of the posted solutions worked unfortunately. Probably due to meanwhile changes in boto itself.
But sometimes a look into the manual does help..
import logging
import boto3
boto3.set_stream_logger('', logging.CRITICAL)
This answer is for those who're using logging.config.dictConfig.
It is recommended to disable DEBUG and INFO messages from all external packages, not limited to botocore
and boto3
:
LOGGING_CONFIG = { # Add your preexisting logging config here.
"loggers": { # Add your preexisting loggers here.
"": {"level": "WARNING", "handlers": ["console"], "propagate": False}, # Root logger.
}
Alternatively, to disable debug messages from botocore
and boto3
but not from all external packages:
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},
}
Assuming your logging configuration dict is named LOGGING
, run this next:
logging.config.dictConfig(LOGGING)
The above must be run before boto3 is imported, irrespective of whether it is imported directly or indirectly! It won't entirely work if it's run after boto3 is already imported. You can choose to replace "WARNING"
above with "INFO"
or "ERROR"
or "CRITICAL"
.
This is the only solution, which works for me as of today (2020/01/31):
for name in ['boto', 'urllib3', 's3transfer', 'boto3', 'botocore', 'nose']:
logging.getLogger(name).setLevel(logging.CRITICAL)
logger = logging.getLogger(__name__)
The solution with
boto3.set_stream_logger('', logging.CRITICAL)
was killing my whole non-boto logs. It manipulates the root logger of the standard logging from python.
Try it out for yourself:
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}')
Regardless of where the init of the logger
happens, it won't bring up the output.
Remove the line of the boto3.set_stream_logger('', logging.CRITICAL)
and the non-boto3 logs will re-appear again!
Consequently the only working solution is NOT to use the approach with boto3.set_stream_logger()
and apply it as I suggested.
You could try
import logging
logging.getLogger('boto').setLevel(logging.CRITICAL)
which will suppress all (other than CRITICAL) errors.
Boto uses logging configuration files (e.g. /etc/boto.cfg
, ~/.boto
) so see if you can configure it to your needs that way.
The set_file_logger
call simply adds a user-defined file to the logging setup, so you can't use that to turn logging off.
I move the boto3 answer from the comments (namely charneykaye and gene_wood) to a proper answer:
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)
To get all the loggers follow the response from leobarcellos:
import logging
loggers_dict = logging.Logger.manager.loggerDict