如何从实例中获取Zope安装的位置?

时间:2016-02-19 16:55:08

标签: python logging plone zope

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

有没有一种简单的方法可以实现这一目标?

2 个答案:

答案 0 :(得分:3)

过去我有一个类似的用例。 我通过声明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函数,初始返回将避免多次记录。

无论如何,如果您不想使用buildout和自定义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或您的首选方法)到环境变量中。

答案 1 :(得分:2)

您可以让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环境变量,这可能就足够了。