我正在覆盖psycopg2的connection.notices。
我的目标是将PostgreSQL触发器的通知发送到我的应用程序。
在python中,我想将当前stacktrace写入日志文件,以查看哪个python代码正在触发数据库中的触发器。
它可以工作,但是很遗憾,我无法提取整个堆栈跟踪。
我只得到psycopg下面的行,而不是上面的(呼叫者的行)。
这是我的代码:
# Overwriting connetion.notices via Django
class MyAppConfig(AppConfig):
def ready(self):
connection_created.connect(connection_created_check_for_notice_in_connection)
class ConnectionNoticeList(object):
def append(self, message):
if not 'some_magic_of_db_trigger' in message:
return
logger.warn('%s %s' % (message, ''.join(traceback.format_stack())))
def connection_created_check_for_notice_in_connection(sender, connection, **kwargs):
connection.connection.notices=ConnectionNoticeList()
我在日志中看到了这个
'NOTICE: some_magic_of_db_trigger: 17909
File "/snap/pycharm-community/128/helpers/pycharm/_jb_pytest_runner....ork/foo/apps.py", line 47, in append
logger.warn(\'%s %s\' % (message, \'\'.join(traceback.format_stack())))
'
traceback.format_stack()
中的 ConnectionNoticeList.append()
不会提取呼叫者。
有没有办法获取上层方法的内容?
(这与一个较早的问题有关:Log Stacktrace of current Python Interpreter via PostgreSQL trigger)
答案 0 :(得分:0)
以上代码有效。我看到了整个回溯。
我不知道为什么在PyCharm中削减了追溯。在生产中,我可以看到整个回溯,并且可以找到损坏的代码,这些代码以不应该发生的方式修改了数据。
非常感谢Daniele Varrazzo提供了覆盖连接的提示。注意: