gpt4 book ai didi

python - 以通用方式对 Python 日志消息进行自定义处理

转载 作者:太空宇宙 更新时间:2023-11-03 15:08:51 24 4
gpt4 key购买 nike

我正在尝试找出对 Python 日志消息应用一些自定义处理的最佳方法,同时对我们的代码库的影响最小。

问题是这样的:我们有许多不同的项目记录了很多东西,其中可以找到一些 AWS key 。作为一项安全要求,我们需要从日志中删除所有 AWS key ,有多种方法可以解决此问题:

  • 天真的方法是进入每个项目,并修改每个记录调用以手动删除 key 。这是最不受欢迎的方法,因为它最需要手动操作。
  • 实现一个不同的模块,提供与logging 模块相同的功能(如infoerror ...)和每个功能定义将首先应用正则表达式过滤掉 AWS key ,然后在幕后调用实际的 logging 方法。然后可以将每个项目修改为类似 import custom_logging_module as logging 的内容,并且不需要修改任何日志记录调用。不过,这种方法的缺点是,看起来每个日志记录调用都来自日志中的这个模块,因此您无法跟踪消息的来源。
  • 还不确定采用何种形式,但听起来可以实现自定义 LoggerLogRecord 并在初始化日志记录时注册它。这不会有以前方法的问题。

我已经对方法 #3 进行了一些研究,但无法真正找到实现此目的的方法。有没有人有对适用于此用例的日志消息应用一些自定义处理的经验?

最佳答案

您可以使用自定义 LogRecord 类来实现此目的,只要您可以明确地识别文本中的键即可。例如:

import logging
import re

KEY = 'PK_SOME_PUBLIC_KEY'
SECRET_KEY = 'SK_SOME_PRIVATE_KEY'

class StrippingLogRecord(logging.LogRecord):

pattern = re.compile(r'\b[PS]K_\w+\b', re.I)

def getMessage(self):
message = super(StrippingLogRecord, self).getMessage()
message = self.pattern.sub('-- key redacted --', message)
return message

if hasattr(logging, 'setLogRecordFactory'):
# 3.x has this
logging.setLogRecordFactory(StrippingLogRecord)
else:
# 2.x needs monkey-patching
logging.LogRecord = StrippingLogRecord

logging.basicConfig(level=logging.DEBUG)
logging.debug('Message with a %s', KEY)
logging.debug('Message with a %s', SECRET_KEY)

在我的示例中,我假设您可以使用简单的正则表达式来识别键,但如果这不可行,可以使用更复杂的替代方法。

请注意,上述代码应在记录 key 的任何代码之前运行。

关于python - 以通用方式对 Python 日志消息进行自定义处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29631171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com