Zope 5 从 Python 脚本记录到错误日志

问题描述 投票:0回答:1

通常,当发生异常时,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。

看起来这应该比我正在做的一切简单得多,但我在任何地方都找不到答案,并且希望得到一些帮助。谢谢!

python logging zope
1个回答
0
投票

来自我的回复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
© www.soinside.com 2019 - 2024. All rights reserved.