2017-06-20 5 views
0

私はプログラムをログに記録するためにPythonログを使用しています。すべてのログは現在stdoutに出力されていますが、POST REST呼び出しを使用してリモートログサーバーに送信する必要があります。現在、私のプログラムはロギングのために複数のPOST要求を行います。単一のPOST要求で複数のログをバンドルできるログを送信する最適化された方法はありますか?リモートログ用のPythonログの使用

import logging.handlers 

class SumoHTTPHandler(logging.Handler): 
    def __init__(self, url, host="collectors.sumologic.com", name=None, compressed=False): 
    """ 
    Similar to HTTPHandler but with some custom Sumo-friendly headers 
    """ 
     logging.Handler.__init__(self) 
     self.host = host 
     self.url = url 
     self.name = name 

    def emit(self, record): 
     # this is called multiple times. 
     try: 
      host = self.host 
      h = httplib.HTTPS(host) 
      url = self.url 
      data = urllib.quote(self.format(record)) 
      sep = "?" 
      url = url + "%c%s" % (sep, data) 
      h.putrequest("GET", url) 
      h.putheader("Host", host) 
     except (KeyboardInterrupt, SystemExit): 
      raise 
     except: 
      self.handleError(record) 
+0

一般的に、1回のリクエスト(バッチログなど)で複数のログリクエストをバンドルすると、実際の画像が記録されないことがあります。バッチが失敗した場合、ログを回復するのは難しいかもしれません。アプリケーションのパフォーマンスに影響を与えないように、非同期でリクエストを忘れることがあります。あなたの状況によって異なります。 –

答えて

0

独自のクラスを再実装して作成する必要があるかどうかは不明です。 PythonのロギングモジュールにはHTTPHandlerがあり、リモートへのロギングに非常に役立ちます。あなたがそれを行う方法の例です。

import logging 
import logging.handlers 
logger = logging.getLogger('Synchronous Logging') 
http_handler = logging.handlers.HTTPHandler(
    '127.0.0.1:3000', 
    '/log', 
    method='POST', 
) 
logger.addHandler(http_handler) 

# Log messages: 
logger.warn('Hey log a warning') 
logger.error("Hey log a error") 
関連する問題