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

时间:2010-09-20 15:33:35

标签: python logging pylons mod-wsgi

我正在开发一个使用mod_wsgi在Apache上运行的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)来引用当前路径,但在错误处理程序的“args =('foo')”行中使用%(here)s的行为并不像我期待它。此ini文件的语法是documented on the Paste Deploy site,但未指定%(here)s如何与引用的字符串相关使用。

我应该在“args =('foo')”行中使用什么语法来指定当前路径?

2 个答案:

答案 0 :(得分:7)

问题是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')

(这是因为'os'是在loggs值上调用eval()时日志模块命名空间中的有效变量。但这是日志包的实现细节,可能不长期可靠。)但是这很可能不会给你你想要的东西 - 它很可能会使用Apache进程的工作目录。

你甚至可以在程序之外设置一个环境变量,并使用它:

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

另一种可能性是覆盖日志记录模块或粘贴包中某些函数或类方法的行为。

希望那些人能给你一些想法。

答案 1 :(得分:0)

Paste Deploy的配置文件允许'here'标记指示配置文件所在的目录。然后,您可以相对于此工作。