Использование относительных путей к файлам журналов в Pylons 'development.ini - PullRequest
7 голосов
/ 20 сентября 2010

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

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

Ответы [ 2 ]

7 голосов
/ 21 сентября 2010

Проблема заключается в том, что 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' является допустимой переменной в пространстве имен модуля ведения журнала, когда он вызывает eval () для значения args. Но это деталь реализации пакета ведения журнала, которая может быть ненадежной в долгосрочной перспективе.) Но это, скорее всего, не даст вам того, что вы хотите - скорее всего, оно будет использовать рабочий каталог процесса Apache.

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

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

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

Надеюсь, что они дают вам некоторые идеи.

0 голосов
/ 21 сентября 2010

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

...