How to Add Logging to a File When Using Requests¶
author: | Ian Cordasco |
---|---|
tags: | requests, logging, 1.x |
In the latest versions of [Requests](https://github.com/kennethreitz/requests)
the ability to configure sessions was removed and with it the ability to set a
verbose
option with a file-like object. Recently, a user stepped into
#python-requests
on Freenode and asked how to restore the behavior from
before the refactor.
If one goes back in time
(git checkout 9dce7861134c60596b91dfa8eda2ff66f5c5d5e5
), you will see
(using grep
) that the call took place in models.py
and simply
formatted a string using datetime.now().isformat()
, the request method and
the URL. We no longer have that available to us, so the next best thing is to
use urllib3
‘s built in logging. If you wanted, you could make it log to
stderr by doing
import requests
requests.packages.urllib3.add_stderr_logger()
But then you’ll only have the logged output printed to your terminal and that is not what the user wanted. Another way of doing this is to use the logging module yourself
import requests
import logging
logger = logging.getLogger('requests.packages.urllib3')
fh = logging.FileHandler()
# ...
logger.addHandler(fh, level=logging.DEBUG)
Why does this work?¶
urllib3
uses it’s namespace to register its own logger with the logging
module (roughly speaking). In this instance, urllib3
isn’t a standalone
package but part of requests
, so its proper namespace is
requests.packages.urllib3
. Using that information, you can get the
logging.Logger
instance and configure it to your needs and desires. Note,
however, that this will give you more detail than the old verbose
configuration option did. As such, choose your level as you see fit.