Проблема с отправкой журналов Python в Splunk с помощью splunk_hec_handler
Я использую библиотеку ведения журналов Python (https://github.com/vavarachen/splunk_hec_handler) для отправки журналов в splunk. Этот пакет использует метод HEC для отправки журналов в splunk.
Проблема, с которой я сталкиваюсь, заключается в том, что из многих операторов регистратора в моем приложении я хочу выборочно только несколько операторов регистратора, чтобы разделить не все. Итак, я создал один метод ниже, который преобразует строковые журналы в json (ключ / значение) и вставляет в splunk. Поэтому я вызываю этот метод сразу после оператора logger, который я хочу отправить в splunk. Но оставьте все операторы logger, которые я не делаю. хотят отправить в 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
1 ответ
Я считаю, что проблема в ваших звонкахlogging.getLogger
, а именно, когда вы настраиваете регистратор приложений, вы указываете имя регистратора, но когда вы настраиваете регистратор splunk, вы ничего не указываете и, следовательно, получаете, настраиваете и прикрепляете SplunkHandler к корневому регистратору.
Когда события по умолчанию поступают в регистраторы более низкого уровня, они распространяют свои события в регистраторы более высокого уровня (например, корневой регистратор) и, таким образом, отправляются в Splunk.
Я подозреваю, что простым решением было бы посмотреть имена ваших регистраторов ... возможно, поместить регистратор Splunk на более низкий уровень, чем ваш компонент? или посмотрите на распространение регистраторов. На той же странице документации, указанной выше, немного рассказывается об объектах регистратора и их распространении.