2017-06-20 54 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

不確定你的確切情況,但是,通常在單個請求(如批處理日誌記錄)中捆綁多個日誌請求可能不會記錄真實的圖片。如果批次失敗,可能很難恢復日誌。您可以異步執行* fire和forget *請求,以便應用程序性能不受影響。取決於你的情況。 –

回答

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")