새로 생성 된 데이터베이스를 업그레이드하기 위해 alembic API 호출과 함께 데이터베이스 작업을 수행하는 스크립트가 있습니다. 파이썬 로거 인스턴스에서 모듈 수준 로거를 사용하여 로그를 기록하는 문제가 있습니다.alembic.config.main을 사용하면 로그 출력이 리디렉션됩니다.
그런 다음 스크립트는 alembic.config.main(argv=alembic_args)
을 호출하여 마이그레이션을 실행합니다. 그러나 원래 로거 인스턴스를 사용하는 alembic 호출 이후의 모든 로그 문은 예상 로그 파일에 기록되지 않습니다.
다음은 동작을 재현하는 예제 스크립트입니다.
#!/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를 호출 한 후 다른 곳에서 지시된다.
또한 동일한 결과를 산출 한 별도의 스레드에서 alembic 호출을 실행 해 보았습니다. 필자가 예상 한 것은 로그 기록이 마이그레이션을 위해 alembic을 사용한 후에도 지정된 파일에 계속 쓰지만 일어나지는 않을 것입니다. 그리고 실제로, 나중에 호출되는 코드에 대해 LOG
인스턴스를 깨고 있습니다. 내가 여기서 뭔가를 놓친 게 아니라면. 증류기가 alembic.ini
에서 fileConfig
를 사용하여 로깅을 설정하기 때문에
아, 그렇군요. 나는 런타임에 별도의 프로세스에서 alembic 명령을 실행하는 것을 끝내었다. 당신의 솔루션이 훨씬 낫습니다. 고맙습니다. – trendsetter37
이것은 훌륭한 솔루션입니다. 또한 Config 인스턴스화를 사용하여'config.attributes' 대신에 configure_logger 값을 설정할 것을 권장하고 싶습니다. 즉. 'config = Config ('alembic.ini', 속성 = { 'configure_logger': 거짓})' – Imjohsep