2010-09-20 1 views
5

Я работаю над приложением Pylons, которое работает поверх Apache с mod_wsgi. Я хотел бы отправить протоколирующие сообщения, которые мое приложение генерирует в файлы в каталоге моего приложения, а не в журналы Apache. Кроме того, я хотел бы указать расположение лог-файлов через относительный путь, чтобы было легче развернуть мое приложение на других серверах. Прямо сейчас я могу регистрироваться в файлах, но только через хрупкий абсолютный путь.Использование относительных путей для регистрации файлов в Pylons's development.ini

Вот соответствующая часть моего 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 услужливо советует использовать% (здесь) S для обозначения текущего пути, с помощью% (здесь) s в "args = ('foo')" строка обработчика ошибок не ведет себя так, как я ожидаю. Синтаксис этого ini-файла - documented on the Paste Deploy site, но не указывает, как использовать% (здесь) s по отношению к цитируемым строкам.

Какой синтаксис следует использовать в строке "args = ('foo')", чтобы указать текущий путь?

ответ

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') 

(Это работает, потому что «ОС» является допустимым переменной в пространстве имен модуля логирования при вызове Eval() на значении ARGS Но это деталь реализации из. который может быть ненадежным долговременным.) Но это, скорее всего, не даст вам то, что вы хотите - он, скорее всего, будет использовать рабочий каталог процесса Apache.

Можно даже установить переменную окружения вне программы, и использовать его как:

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

И еще одна возможность перекрывая поведение некоторых функций или методов класса в модуле регистрации или упаковки пасты ,

Надеюсь, что это даст вам несколько идей.

+0

А, это привело меня к горлу мозга. Спасибо. Я использую первый вариант на данный момент - он по крайней мере мешает мне быть вопиющим, не сухим, потому что я разделяю сообщения на несколько разных файлов журналов. –

0

Файлы конфигурации для Paste Deploy позволяют использовать тег 'here' для указания каталога, в котором находится файл конфигурации. Затем вы можете работать с этим.

+0

Я уточнил вопрос с разъяснением в ответ на ваш ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^