python - Python 日志记录 - 覆盖“记录”中的 args/msg 以避免更改为可变对象数据
问题描述
有没有一种方法可以使用编辑类来实现 Python 日志过滤器,使得任何使用参数记录消息的调用(例如 LOGGER.debug('my message, %s, %s', data1, data2) 都使用msg 和 args 的副本而不是传递的可变对象?我们的实现意味着日志编辑类最终会更改可变数据,然后将这些数据与编辑字符串一起存储/发送。我知道我们可以在调用记录器时执行此操作例如 LOGGER.debug('my message, %s, %s', copy.deepcopy(data1), copy.deepcopy(data2)),但希望有一种方法可以覆盖“记录”的过滤函数 resposnbile “在日志记录设置定义中?
解决方案
您必须覆盖该makeRecord
功能。到应用过滤器时,记录已经创建。
import logging
import copy
class CopyLogger(logging.Logger):
def makeRecord(self, name, level, fn, lno, msg, args, exc_info, func=None, extra=None, sinfo=None):
args = copy.deepcopy(args) # <- this is the line you care about
return super().makeRecord(name, level, fn, lno, msg, args, exc_info, func, extra, sinfo)
logging.setLoggerClass(CopyLogger)
log = logging.getLogger('mylogger')
data1 = 'hello'
data2 = 'world'
log.warning('my message, %s, %s', data1, data2)
推荐阅读
- cpu-architecture - 在 16 位数据路径上移动 32 位数字
- javascript - 如何阻止它向所有字典写入值?(Javascript)
- java - 查找字符串中所有单词“google”、“gooogle”、...中字母数量“o”的乘积
- makefile - 我们什么时候使用 := 以及什么时候在 GNU makefile 中使用 =?
- helper - 使用 near-api-js 的主网的近协议帮助程序 url
- flutter - 使用颤振插件切断按钮的着色器
- python-3.x - 将人员对象添加到另一个对象,除非它们相同
- c - ***检测到堆栈粉碎***:即使我输入的字符少得多,也会终止
- amazon-web-services - 如何将通用策略附加到 1 个以上的存储桶,同时让存储桶动态分配?
- ionic-framework - ionic 5 Ionic/Angular 无法在 android 模拟器中发出 http 请求(网络:ERR_CONNECTION_REFUSED)