У меня есть сценарий, который выполняет операции с базой данных вместе с вызовом API-интерфейса перегонного куба для обновления только что созданной базы данных до головы. У меня проблема с экземпляром регистратора python, когда журналы записываются в файл с использованием регистратора уровня модуля.
Затем сценарий вызывает alembic.config.main(argv=alembic_args)
для выполнения миграции. Однако каждый оператор журнала после вызова перегонного куба, использующий исходный экземпляр средства ведения журнала, не записывается в ожидаемый файл журнала.
Вот пример сценария, который воспроизводит поведение.
#!/usr/bin/env python3
import logging
import os
import alembic.config
from .utilities import get_migration_dir
logging.basicConfig(filename='test.log',
level=logging.DEBUG)
CUR_DIR = os.path.dirname(__file__)
LOG = logging.getLogger('so_log')
LOG.info('Some stuff')
LOG.info('More stuff')
alembic_config = (
'--raiseerr',
'upgrade', 'head'
)
os.chdir(get_migration_dir())
alembic.config.main(argv=alembic_config)
os.chdir(CUR_DIR)
LOG.debug('logging after alembic call.')
LOG.debug('more logging after alembic call.')
print('Code still running after alembic')
Вывод файла журнала
INFO:so_log:Some stuff
INFO:so_log:More stuff
стандартный вывод
INFO [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO [alembic.runtime.migration] Will assume transactional DDL.
print statement before alembic
Code still running after alembic
Похоже, что экземпляр регистратора LOG
теряет контекст или перенаправляется в другое место после вызова API-интерфейса перегонного куба.
Кроме того, я попытался запустить вызов перегонного куба в отдельном потоке, который дал тот же результат. Я ожидаю, что операторы журнала продолжат запись в указанный файл после использования перегонного куба для миграции, но этого не происходит. И, кроме того, он фактически ломает экземпляр LOG
для любого кода, который вызывается позже; Если я просто что-то пропустил здесь.