Python logging : 使用日志模块将数据记录到服务器
Python logging : Log data to server using the logging module
日志模块提供了使用 HTTPHandler 的可能性,
由于格式限制,这不符合我的要求。
如文档中所述,https://docs.python.org/3/library/logging.handlers.html,使用 setFormatter() 为 HTTPHandler 指定格式化程序无效。
我的目标是在我的应用程序中记录事件,并在本地服务器上收集它们。
我正在使用 JSON-Server 来模拟 REST API (https://github.com/typicode/json-server)。
我已将此 link : 称为可能的解决方案,但我无法获得所需的内容。
我的代码:
"""class CustomHandler(logging.handlers.HTTPHandler):
def __init__(self):
logging.handlers.HTTPHandler.__init__(self)
def emit(self, record):
log_entry = self.format(record)
# some code....
url = 'http://localhost:3000/posts'
# some code....
return requests.post(url, log_entry, json={"Content-type": "application/json"}).content """
def custom_logger(name):
logger = logging.getLogger(name)
formatter_json = jsonlogger.JsonFormatter(
fmt='%(asctime)s %(levelname)s %(name)s %(message)s')
requests.post('http://localhost:3000/posts', json= {"message" : "1" } )
filehandler_all = logging.FileHandler('test.log')
filehandler_all.setLevel(logging.DEBUG)
filehandler_all.setFormatter(formatter_json)
logger.addHandler(filehandler_all)
#http_handler = logging.handlers.HTTPHandler('http://localhost:3000' ,
#"/posts", "POST")
#
# http_handler = CustomHandler()
# http_handler.setFormatter(formatter_json)
# http_handler.setLevel(logging.DEBUG)
return logger
logger = custom_logger("http")
logger.exception("{'sample json message' : '2'}")
注释用于测试,便于代码重现。
在上面的代码片段中,filehandler 完美地处理了 json 文件,但 HTTPHandler 却没有。我尝试创建一个在 link 中指定的 CustomHandler,原则上它应该可以工作,但我无法弄清楚细节。
通过更改“mapLogRecord”和“emit”方法构建 CustomHandler 是否有意义?
最重要的是获取JSON格式的数据。
解决此问题的任何其他想法也会有所帮助!
好的,这是一个可以在服务器上以 JSON 格式输出日志的解决方案。它使用自定义记录器。我还可以根据适用性来格式化消息。下面的代码以 json 格式给出输出并使用请求模块。
class RequestsHandler(logging.Handler):
def emit(self, record):
log_entry = self.format(record)
return requests.post('http://localhost:3000/posts',
log_entry, headers={"Content-type": "application/json"}).content
class FormatterLogger(logging.Formatter):
def __init__(self, task_name=None):
super(FormatterLogger, self).__init__()
def format(self, record):
data = {'@message': record.msg,
'@funcName' : record.funcName,
'@lineno' : record.lineno,
'@exc_info' : record.exc_info,
'@exc_text' : record.exc_text,
}
return json.dumps(data)
def custom_logger(name):
logger = logging.getLogger(name)
custom_handler = RequestsHandler()
formatter = FormatterLogger(logger)
custom_handler.setFormatter(formatter)
logger.addHandler(custom_handler)
return logger
logger = custom_logger("http")
logger.exception("{'sample json message' : '2'}")
数据变量控制可以添加到消息中的参数。
输出:
{
"@message": "{'sample json message' : '2'}",
"@funcName": "<module>",
"@lineno": 62,
"@exc_info": [
null,
null,
null
],
"@exc_text": null,
"id": 138
}
日志模块提供了使用 HTTPHandler 的可能性, 由于格式限制,这不符合我的要求。
如文档中所述,https://docs.python.org/3/library/logging.handlers.html,使用 setFormatter() 为 HTTPHandler 指定格式化程序无效。
我的目标是在我的应用程序中记录事件,并在本地服务器上收集它们。 我正在使用 JSON-Server 来模拟 REST API (https://github.com/typicode/json-server)。 我已将此 link : 称为可能的解决方案,但我无法获得所需的内容。
我的代码:
"""class CustomHandler(logging.handlers.HTTPHandler):
def __init__(self):
logging.handlers.HTTPHandler.__init__(self)
def emit(self, record):
log_entry = self.format(record)
# some code....
url = 'http://localhost:3000/posts'
# some code....
return requests.post(url, log_entry, json={"Content-type": "application/json"}).content """
def custom_logger(name):
logger = logging.getLogger(name)
formatter_json = jsonlogger.JsonFormatter(
fmt='%(asctime)s %(levelname)s %(name)s %(message)s')
requests.post('http://localhost:3000/posts', json= {"message" : "1" } )
filehandler_all = logging.FileHandler('test.log')
filehandler_all.setLevel(logging.DEBUG)
filehandler_all.setFormatter(formatter_json)
logger.addHandler(filehandler_all)
#http_handler = logging.handlers.HTTPHandler('http://localhost:3000' ,
#"/posts", "POST")
#
# http_handler = CustomHandler()
# http_handler.setFormatter(formatter_json)
# http_handler.setLevel(logging.DEBUG)
return logger
logger = custom_logger("http")
logger.exception("{'sample json message' : '2'}")
注释用于测试,便于代码重现。
在上面的代码片段中,filehandler 完美地处理了 json 文件,但 HTTPHandler 却没有。我尝试创建一个在 link 中指定的 CustomHandler,原则上它应该可以工作,但我无法弄清楚细节。
通过更改“mapLogRecord”和“emit”方法构建 CustomHandler 是否有意义?
最重要的是获取JSON格式的数据。
解决此问题的任何其他想法也会有所帮助!
好的,这是一个可以在服务器上以 JSON 格式输出日志的解决方案。它使用自定义记录器。我还可以根据适用性来格式化消息。下面的代码以 json 格式给出输出并使用请求模块。
class RequestsHandler(logging.Handler):
def emit(self, record):
log_entry = self.format(record)
return requests.post('http://localhost:3000/posts',
log_entry, headers={"Content-type": "application/json"}).content
class FormatterLogger(logging.Formatter):
def __init__(self, task_name=None):
super(FormatterLogger, self).__init__()
def format(self, record):
data = {'@message': record.msg,
'@funcName' : record.funcName,
'@lineno' : record.lineno,
'@exc_info' : record.exc_info,
'@exc_text' : record.exc_text,
}
return json.dumps(data)
def custom_logger(name):
logger = logging.getLogger(name)
custom_handler = RequestsHandler()
formatter = FormatterLogger(logger)
custom_handler.setFormatter(formatter)
logger.addHandler(custom_handler)
return logger
logger = custom_logger("http")
logger.exception("{'sample json message' : '2'}")
数据变量控制可以添加到消息中的参数。
输出:
{
"@message": "{'sample json message' : '2'}",
"@funcName": "<module>",
"@lineno": 62,
"@exc_info": [
null,
null,
null
],
"@exc_text": null,
"id": 138
}