在Pylons的development.ini中使用相对路径记录文件

7 投票
2 回答
5387 浏览
提问于 2025-04-16 04:22

我正在开发一个基于Apache和mod_wsgi的Pylons应用程序。我希望将我的应用生成的日志信息发送到应用目录下的文件,而不是Apache的日志中。此外,我还想通过相对路径来指定日志文件的位置,这样在将我的应用部署到其他人的服务器上时会更方便。目前我可以将日志记录到文件中,但只能通过一个不太可靠的绝对路径。

以下是我development.ini文件中相关的部分:

# Logging configuration
[loggers]
keys = root, routes, myapp, sqlalchemy, debugging-logger

[handlers]
keys = console, debugging-logger-file

[formatters]
keys = generic

[logger_debugging-logger]
level = DEBUG
handlers = debugging-logger-file
qualname = myapp.controllers.logging-test-controller.debugging-logger

[handler_debugging-logger-file]
class = FileHandler
args = ('/var/pylons/myapp/logs/myapp-debugging-errors.log', 'a')
level = DEBUG
formatter = generic

虽然这个.ini文件很贴心地建议使用%(here)s来引用当前路径,但在错误处理程序的"args = ('foo')"这一行中使用%(here)s时,结果并不是我预期的那样。这个ini文件的语法在Paste Deploy网站上有说明,但并没有具体说明如何在带引号的字符串中使用%(here)s。

我应该在"args = ('foo')"这一行使用什么语法来指定当前路径呢?

2 个回答

0

Paste Deploy的配置文件里可以使用一个叫做'here'的标签,这个标签用来指示配置文件所在的目录。这样你就可以根据这个目录来进行相对路径的操作。

8

问题在于,Paste Deploy 创建了一个 ConfigParser 对象来存储默认设置中的 'here' 标签,但 logging.config.fileConfig() 并没有接收到这组默认设置。因此,当 fileConfig() 读取 .ini 文件时,它无法访问 'here' 标签,导致 ConfigParser 的插值功能找不到它。

你可以尝试这样做:

[DEFAULT]
my_log_dir = '/var/pylons/myapp/logs'
...
[handler_debugging-logger-file]
args = (%(my_log_dir)s + '/myapp-debugging-errors.log', 'a')

这可能不是你想要的,但它稍微更灵活一些。

还有另一种可能性是:

args = (os.getcwd() + '/myapp-debugging-errors.log', 'a')

(之所以可行,是因为在 logging 模块调用 eval() 处理 args 值时,'os' 是一个有效的变量。但这属于 logging 包的实现细节,长期来看可能不太可靠。)不过这很可能不能满足你的需求——它很可能会使用 Apache 进程的工作目录。

你甚至可以在程序外部设置一个环境变量,然后像这样使用:

args = (os.environ['MY_LOG_DIR'] + '/myapp-debugging-errors.log', 'a')

还有另一种可能性是重写 logging 模块或 paste 包中某些函数或类方法的行为。

希望这些能给你一些启发。

撰写回答