如何从实例内部获取 Zope 安装位置?

How to get the location of a Zope installation from inside an instance?

我们正在研究 add-on that writes to a log file,我们需要找出默认 var/log 目录的位置(${buildout:directory} 变量的值)。

有没有简单的方法可以做到这一点?

过去我有过类似的用例。 我通过在 zope.conf:

中声明路径来解决它
zope-conf-additional +=
  <product-config pd.prenotazioni>
    logfile ${buildout:directory}/var/log/prenotazioni.log
  </product-config>

查看本产品的自述文件:

然后可以使用以下代码解释此 zope 配置:

from App.config import getConfiguration

product_config = getattr(getConfiguration(), 'product_config', {})
config = product_config.get('pd.prenotazioni', {})
logfile = config.get('logfile')

查看完整示例

值得注意的是,如果多次错误调用 init 函数,初始 return 可避免多次记录。

无论如何,如果您不想使用构建和自定义 zope 配置,您可能想要获取默认事件日志位置

它在zope.conf中指定。你应该有这样的东西:

<eventlog>
  level INFO
  <logfile>
    path /path/to/plone/var/log/instance.log
    level INFO
  </logfile>
</eventlog>

我能够通过以下代码获取路径:

from App.config import getConfiguration 
import os

eventlog = getConfiguration().eventlog
logpath = eventlog.handler_factories[0].instance.baseFilename
logfolder = os.path.split(logpath)[0] 

可能在 App 模块代码中查看您会发现获取此值的更直接的方法。

另一种可能的(恕我直言,较弱的)解决方案是将日志文件路径存储(通过构建或您喜欢的方法)到环境变量中。

您可以让 buildout 在环境变量 parts/instance/etc/zope.conf 中设置它:

[instance]
recipe = plone.recipe.zope2instance
environment-vars =
    BUILDOUT_DIRECTORY ${buildout:directory}

在 Python 代码中检查它:

import os
buildout_directory = os.environ.get('BUILDOUT_DIRECTORY', '')

默认情况下,您已经有了 INSTANCE_HOME 环境变量,这可能就足够了。