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

标签 python logging pylons mod-wsgi

我正在开发一个 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)s 来引用当前路径,但在错误处理程序的“args = ('foo')”行中使用 %(here)s 并不像我希望如此。此 ini 文件的语法为 documented on the Paste Deploy site , 但没有指定如何将 %(here)s 用于引用字符串。

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

最佳答案

问题在于,Paste Deploy 创建了一个 ConfigParser 对象来将“此处”标记存储在它的一组默认值中,而 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')

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

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

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

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

希望这些能给你一些想法。

关于python - 在 Pylons 的 development.ini 中使用相对路径记录文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3752982/

相关文章:

python - Pandas :为无值设置默认日期时间

java - 在 Debug模式下以编程方式启用 Logback?

python - .net automapper 有 python 实现吗?

Django Pylons 神话

google-chrome - 将 Chrome 中的 console.log 保存到文件中

python - 如何在 CKAN 中添加新页面?

python - 使用 PIL 加载和评估像素

python - 在 argsort 索引上排序的 numpy 累积和

python - Pycharm:将文件夹标记为 'sources root' 对于子文件夹不是递归的

java - google eclipse插件创建的log4j.properties和logging.properties有什么区别?