私は、いくつかのAPIに一連のリクエストを行うコードをいくつか持っています。私はすべての人に共通のロギングを設定したいのですが、どうすれば設定できますか?aiohttp.ClientSession()でリクエストを行うときにaiohttp.clientのログを設定する方法は?
今、私が作ったすべての要求のステータスコード、URL、ヘッダとすべてを見てみたいと思いますので、ログの出力は次のように見ているのは、私のコードは、この
import aiohttp
import asyncio
async def fetch(client):
async with client.get('http://httpbin.org/get') as resp:
assert resp.status == 200
return await resp.text()
async def post_data(client):
async with client.post('http://httpbin.org/post', data={'foo': 'bar'}) as resp:
assert resp.status == 200
return await resp.text()
async def main(loop):
async with aiohttp.ClientSession(loop=loop) as client:
html = await fetch(client)
print(html)
other_html = await post_data(client)
print(other_html)
loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop))
のように見えるとしましょう:
2017-08-09 08:44:30 DEBUG (200) <GET http://httpbin.org/get>
2017-08-09 08:44:30 DEBUG (200) <POST http://httpbin.org/post>
すべてのリクエストの後にlogger.log()コールを追加できますが、それは重複しています。より多くのリクエストがある場合は、logger.logを呼び出すたびに、重複したコードを書く必要があります。非効率だと思われる。
aiohttp.client loggerがありますが、設定方法の詳細はありません。
私はこの
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
logger.addHandler(ch)
logging.getLogger('aiohttp.client').addHandler(ch)
のようにそれを設定しようとしているが、それは私が見てみたい情報(例えば、応答ステータスコード、URL)を印刷しません。
私は必要なものを達成するための方法がありますか?おそらく、私はクライアントからの何らかの信号を購読し、信号が送られたときに何らかのメッセージを記録することができますか?例えば。クライアントがレスポンスを受信してメッセージをログに記録したときに送信されるシグナルを購読するメカニズムがありますか?
グレート内のすべてのヘルパーメソッドを定義します。非常にきれいな! –
'request'の名前が' _request'に変更されたようです。 –
@JeremyBanksいいえ、 '_request'は変更すべきではない内部のaiohttpです。 'request'メソッドは依然として存在し、すべての要求をインターセプトするために使用できます。 https://github.com/aio-libs/aiohttp/blob/master/aiohttp/clientを参照してください。py#L139 – Arthur