通常,当发生异常时,Zope 会通过 Products.SiteErrorLog 包自动将其记录到 error_log 中,但是我有一个带有 try/ except 块的 python 脚本,因为无论脚本是否成功,我都需要返回 json。不幸的是,异常块覆盖了 Zope 对 error_log 的默认日志记录,并且由于我无法使用 raise,因为它会停止执行脚本的其余部分(包括finally 块或异常块的其余部分),所以我需要一种方法让 Zope 仍然将错误记录到 error_log 中。
据我所知,这是通过 SiteErrorLog.raise() 方法完成的,并且由于在受限制的 python 中,我找不到允许使用 raise 方法的方法,即使我已经允许整个 SiteErrorLog 模块和SiteErrorLog 类,我使用了外部方法,但无法让它工作。
供参考,在我的
__init__.py
中允许我使用的模块和类:
allow_module(Products.SiteErrorLog.SiteErrorLog)
from Products.SiteErrorLog.SiteErrorLog import SiteErrorLog
allow_class(SiteErrorLog)
它允许使用 SiteErrorLog 类和模块,但不允许通过 python 脚本在 ZMI 中使用提升方法。
如果使用 SiteErrorLog 不是正确答案,并且还有更简单的方法,我洗耳恭听。
这是我的 python 脚本的示例:
导入json
try:
context.my_zsql_method()
def returnjson():
value = {"output": "success"}
return json.dumps(value)
return returnjson()
except Exception as e:
def returnjson():
value = {"output": "failure"}
return json.dumps(value)
return returnjson()
除了通常记录到 zope error_log 的标准异常错误之外,我不需要自定义错误消息或任何其他内容,我只希望将其记录在 except 块中。
正如我提到的,我尝试编写一个外部方法,这样我就可以像这样使用 SiteErrorLog.raise() :
from Products.SiteErrorLog.SiteErrorLog import SiteErrorLog
def logError(error):
errorType = type(error).__name__
errorStr = str(error)
error_info = (errorType, errorStr, None)
SiteErrorLog.raising(None, error_info)
并像这样更新我的 except 块:
except Exception as e:
context.logError(e)
def returnjson():
value = {"output": "failure"}
return json.dumps(value)
return returnjson()
但错误日志中没有记录任何内容。 SiteErrorLog.raise() 需要 2 个参数(self、info),并且据说调用外部方法会自动传递 self,但这似乎没有发生。我尝试将 context.error_log 传递到外部方法(不起作用),以及使用 SiteErrorLog 作为 self(不起作用)。
我很久以前就看到一个关于同时使用 raise 和 return 的问题的答案,说要使用 finally 块,所以当然,我也尝试过:
except Exception as e:
raise
finally:
def returnjson():
value = {"status": "failure"}
return json.dumps(value)
return returnjson()
尽管我知道这是不正确的。当然,一旦调用 raise ,脚本的其余部分就会停止所有执行,因此 json 永远不会返回,但我想我至少应该尝试一下。
再次强调,我不想记录到日志文件、写入自定义日志消息或其他任何内容。我只想将异常错误正常记录到 zope 的错误日志中,同时仍然允许我返回 json。
看起来这应该比我正在做的一切简单得多,但我在任何地方都找不到答案,并且希望得到一些帮助。谢谢!
来自我的回复https://community.plone.org/t/zope-5-logging-to-error-log/18701/5
您可以使用Python日志记录:
from logging import getLogger
logger = getLogger("TESTING LOGS")
logger.info("This is a info log entry")
logger.warning("This is a warning")
logger.error("This is an error")
logger.critical("This is a critical error")
2024-02-01 08:36:37,263 INFO [TESTING LOGS:5][waitress-2] This is a info log entry
2024-02-01 08:36:37,271 WARNING [TESTING LOGS:6][waitress-2] This is a warning
2024-02-01 08:36:37,273 ERROR [TESTING LOGS:7][waitress-2] This is an error
2024-02-01 08:36:37,274 CRITICA [TESTING LOGS:8][waitress-2] This is a critical error