【发布时间】:2019-01-02 15:31:57
【问题描述】:
我正在尝试使用标准 python 日志库的 HTTPHandler 类来发送日志。我需要使用基本凭据(用户名和密码)发出 https 发布请求。这就是我设置 HTTPHandler 的方式-
host = 'example.com'
url = '/path'
handler = logging.handlers.HTTPHandler(host, url, method='POST', secure=True, credentials=('username','password'), context=None)
logger.addHandler(handler)
但问题是,我的远程服务器中没有任何日志。我什至没有看到处理程序有任何异常。我是否错误地设置了处理程序参数?我可以使用简单的 pythong http 请求发送类似的日志 -
url = 'https://username:password@example.com/path'
headers = {'content-type': 'application/json'}
jsonLog = { 'id': '4444','level': 'info', 'message': 'python log' };
r = requests.post(url, data = json.dumps(jsonLog), headers=headers)
由于 json 内容类型,我是否需要以某种方式设置标题?如果是,那么我该如何在 httphandler 中进行设置?
更新
我认为我应该更新我最终所做的事情。经过多次搜索,我发现我可以通过覆盖 logging.Handler 的 emit() 来创建自定义处理程序。
class CustomHandler(logging.Handler):
def emit(self, record):
log_entry = self.format(record)
# some code....
url = 'url'
# some code....
return requests.post(url, log_entry, headers={"Content-type": "application/json"}).content
如果有更好的建议欢迎留言。
【问题讨论】:
-
HTTPHandler不使用 JSON - 它以application/x-www-form-urlencoded发送数据。因此,如果您的服务器期待 JSON,我预计它会失败。您是否在 Web 服务器的访问日志中看到了这些请求? -
是的,服务器期待 json。不幸的是,我无权访问服务器日志。有没有办法将内容类型更改为
application/json?喜欢在处理程序中设置标题?
标签: python python-3.x logging python-requests httphandler