使用 splunk_hec_handler 将 python 日志发送到 Splunk 时出现问题
Issue in sending python logs to Splunk using splunk_hec_handler
我正在使用 Python logging library 将日志推送到 splunk。此包使用 HEC 方法将日志推送到 splunk。
我面临的问题是,在我的应用程序中的许多记录器语句中,我只希望有选择地只对少数记录器语句进行 splunk,而不是全部。
所以我在下面的方法中创建了一个方法,该方法将字符串日志转换为 json (key/value) 并推送到 splunk。所以我在我希望推送到 splunk 的记录器语句之后调用此方法。但其余所有我不想发送到 splunk 的记录器语句,它们也被推送到 splunk。
为什么会这样?
class Test:
def __init__(self):
self.logger = logging.getLogger('myapp')
def method_test(self,url,data,headers):
response = requests.post(url=url, data=json.dumps(data), headers=abc.headers)
##i dont want to push this below log message to splunk but this is also getting pushed to splunk
self.logger.debug(f"request code:{response.request.url} request body:{response.request.body}")
##I wish to send this below log to splunk
self.logger.debug(f"response code:{response.status_code} response body:{response.text}")
log_dic = {'response_code': response.status_code,'response_body': response.text}
splunklogger = self.logging_override(log_dic, self.splunk_host,
self.index_token, self.port,
self.proto, self.ssl_verify,
self.source)
splunklogger.info(log_dic)
return response
def logging_override(log_dict: dict, splunk_host,index_token,splunk_port,splunk_proto,ssl_ver,source_splnk):
"""
This function help in logging custom fields in JSON key value form by defining fields of our choice in log_dict dictionary
and pushes logs to Splunk Server
"""
splunklogger = logging.getLogger()
splunklogger.setLevel(logging.INFO)
stream_handler = logging.StreamHandler()
basic_dict = {"time": "%(asctime)s", "level": "%(levelname)s"}
full_dict = {**basic_dict, **log_dict}
stream_formatter = logging.Formatter(json.dumps(full_dict))
stream_handler.setFormatter(stream_formatter)
if not splunklogger.handlers:
splunklogger.addHandler(stream_handler)
splunklogger.handlers[0] = stream_handler
splunk_handler = SplunkHecHandler(splunk_host,
index_token,
port=splunk_port, proto=splunk_proto, ssl_verify=ssl_ver,
source=source_splnk)
splunklogger.addHandler(splunk_handler)
splunklogger.addHandler(splunk_handler)
return splunklogger
我认为问题出在您对 logging.getLogger
的调用上,即当您配置应用程序记录器时,您指定了一个记录器名称,但是当您配置 splunk 记录器时,您没有指定任何内容,因此获取、配置 SplunkHandler 并将其附加到根记录器。
默认情况下,当事件进入较低级别的记录器时,它们会将事件传播到较高级别的记录器(例如根记录器),从而发送到 Splunk。
我怀疑一个简单的解决方案是查看您的记录器名称...可能会将 Splunk 记录器置于比您的组件更低的级别?或查看记录器的传播。上面链接的同一文档页面讨论了一些关于记录器对象及其传播的内容。
我正在使用 Python logging library 将日志推送到 splunk。此包使用 HEC 方法将日志推送到 splunk。
我面临的问题是,在我的应用程序中的许多记录器语句中,我只希望有选择地只对少数记录器语句进行 splunk,而不是全部。 所以我在下面的方法中创建了一个方法,该方法将字符串日志转换为 json (key/value) 并推送到 splunk。所以我在我希望推送到 splunk 的记录器语句之后调用此方法。但其余所有我不想发送到 splunk 的记录器语句,它们也被推送到 splunk。
为什么会这样?
class Test:
def __init__(self):
self.logger = logging.getLogger('myapp')
def method_test(self,url,data,headers):
response = requests.post(url=url, data=json.dumps(data), headers=abc.headers)
##i dont want to push this below log message to splunk but this is also getting pushed to splunk
self.logger.debug(f"request code:{response.request.url} request body:{response.request.body}")
##I wish to send this below log to splunk
self.logger.debug(f"response code:{response.status_code} response body:{response.text}")
log_dic = {'response_code': response.status_code,'response_body': response.text}
splunklogger = self.logging_override(log_dic, self.splunk_host,
self.index_token, self.port,
self.proto, self.ssl_verify,
self.source)
splunklogger.info(log_dic)
return response
def logging_override(log_dict: dict, splunk_host,index_token,splunk_port,splunk_proto,ssl_ver,source_splnk):
"""
This function help in logging custom fields in JSON key value form by defining fields of our choice in log_dict dictionary
and pushes logs to Splunk Server
"""
splunklogger = logging.getLogger()
splunklogger.setLevel(logging.INFO)
stream_handler = logging.StreamHandler()
basic_dict = {"time": "%(asctime)s", "level": "%(levelname)s"}
full_dict = {**basic_dict, **log_dict}
stream_formatter = logging.Formatter(json.dumps(full_dict))
stream_handler.setFormatter(stream_formatter)
if not splunklogger.handlers:
splunklogger.addHandler(stream_handler)
splunklogger.handlers[0] = stream_handler
splunk_handler = SplunkHecHandler(splunk_host,
index_token,
port=splunk_port, proto=splunk_proto, ssl_verify=ssl_ver,
source=source_splnk)
splunklogger.addHandler(splunk_handler)
splunklogger.addHandler(splunk_handler)
return splunklogger
我认为问题出在您对 logging.getLogger
的调用上,即当您配置应用程序记录器时,您指定了一个记录器名称,但是当您配置 splunk 记录器时,您没有指定任何内容,因此获取、配置 SplunkHandler 并将其附加到根记录器。
默认情况下,当事件进入较低级别的记录器时,它们会将事件传播到较高级别的记录器(例如根记录器),从而发送到 Splunk。
我怀疑一个简单的解决方案是查看您的记录器名称...可能会将 Splunk 记录器置于比您的组件更低的级别?或查看记录器的传播。上面链接的同一文档页面讨论了一些关于记录器对象及其传播的内容。