2017-08-09 24 views
3

私は、いくつかの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)を印刷しません。

私は必要なものを達成するための方法がありますか?おそらく、私はクライアントからの何らかの信号を購読し、信号が送られたときに何らかのメッセージを記録することができますか?例えば。クライアントがレスポンスを受信して​​メッセージをログに記録したときに送信されるシグナルを購読するメカニズムがありますか?

答えて

6

あなたはaiohttpのコードで見ることができるように、aiohttp.clientロガーが要求をログに記録するために使用されていませんが、応答クッキーはあなたがすべての要求をログに記録するには https://github.com/aio-libs/aiohttp/search?utf8=%E2%9C%93&q=client_logger&type=

無効である場合にのみ警告をログに記録することができますあなたが望むことを行うカスタムClientSessionを作成する必要があります。ような何か:

class LoggingClientSession(aiohttp.ClientSession): 
    def request(self, method, url, **kwargs): 
     logger.debug('Starting request <%s %r>', method, url) 
     return super().request(method, url, **kwargs) 

- ここにコメントでJaanusで述べたように

postget、...ヘルパーは代わりrequestの、直接ClientSession._requestを呼び出す知っています。したがって、後者を無効にすることは、ショートハンドヘルパーとの通話を傍受しません。

だからどちらか:常に

  • オーバーライド_requestの代わりに、あなたのヘルパーでrequest

  • か、あなたのコードはgetを使用したことがないことを確認してください/ ...ヘルパーとは直接requestを呼び出します。

  • や、クラス内のそれを包むためのあなたのLoggingClientSession

+1

グレート内のすべてのヘルパーメソッドを定義します。非常にきれいな! –

+0

'request'の名前が' _request'に変更されたようです。 –

+0

@JeremyBanksいいえ、 '_request'は変更すべきではない内部のaiohttpです。 'request'メソッドは依然として存在し、すべての要求をインターセプトするために使用できます。 https://github.com/aio-libs/aiohttp/blob/master/aiohttp/clientを参照してください。py#L139 – Arthur