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

我正在开发一个Pylons应用程序,它使用mod_wsgi在Apache上运行.我想将我的应用生成的日志消息发送到应用程序目录中的文件,而不是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’)”行中使用什么语法来指定当前路径?

最佳答案
问题是,粘贴部署创建一个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’是日志模块命名空间中的有效变量,当它在args值上调用eval()时.但这是日志包的实现细节,可能不长期可靠.)但这很可能不会给你你想要的东西 – 它很可能会使用Apache进程的工作目录.

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

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

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

希望那些给你一些想法.

转载注明原文:使用相对路径在Pylons的development.ini中记录文件 - 代码日志