Bri*_*ell 7 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
Run Code Online (Sandbox Code Playgroud)
尽管.ini帮助建议使用%(here)来引用当前路径,但在错误处理程序的"args =('foo')"行中使用%(here)s的行为并不像我期望的那样至.此粘贴文件的语法记录在粘贴部署站点上,但未指定%(here)s如何与引用的字符串相关使用.
我应该在"args =('foo')"行中使用什么语法来指定当前路径?
问题是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')
Run Code Online (Sandbox Code Playgroud)
不完全是你想要的,但更可配置.
另一种可能性是:
args = (os.getcwd() + '/myapp-debugging-errors.log', 'a')
Run Code Online (Sandbox Code Playgroud)
(这是因为'os'是在loggs值上调用eval()时日志模块命名空间中的有效变量.但这是日志包的实现细节,可能长期不可靠.)但这很可能不会给你你想要的东西 - 它很可能会使用Apache进程的工作目录.
你甚至可以在程序之外设置一个环境变量,并使用它:
args = (os.environ['MY_LOG_DIR'] + '/myapp-debugging-errors.log', 'a')
Run Code Online (Sandbox Code Playgroud)
另一种可能性是覆盖日志记录模块或粘贴包中的某些函数或类方法的行为.
希望那些给你一些想法.