2017-02-23 3 views
3

새로 생성 된 데이터베이스를 업그레이드하기 위해 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를 사용하여 로깅을 설정하기 때문에

답변

4

이것은, 당신은 당신의 env.py 스크립트에서 볼 수 있습니다

# Interpret the config file for Python logging. 
# This line sets up loggers basically. 
fileConfig(config.config_file_name) 

을이 효과적으로 원래 로거 설정을 재정의합니다.

이 문제를 방지하려면 env.py에서이 줄을 제거하면되지만 콘솔에서 alembic을 실행할 때 로그가 생성되지 않습니다.

alembic.config.main 대신 alembic.command을 통해 alembic 명령을 실행하는 것이 더 강력한 옵션입니다. 이 방법은 런타임에 증류기 설정을 재정의 할 수

다음
from alembic.config import Config 
import alembic.command 

config = Config('alembic.ini') 
config.attributes['configure_logger'] = False 

alembic.command.upgrade(config, 'head') 

env.py에서 :

if config.attributes.get('configure_logger', True): 
    fileConfig(config.config_file_name) 
+0

아, 그렇군요. 나는 런타임에 별도의 프로세스에서 alembic 명령을 실행하는 것을 끝내었다. 당신의 솔루션이 훨씬 낫습니다. 고맙습니다. – trendsetter37

+1

이것은 훌륭한 솔루션입니다. 또한 Config 인스턴스화를 사용하여'config.attributes' 대신에 configure_logger 값을 설정할 것을 권장하고 싶습니다. 즉. 'config = Config ('alembic.ini', 속성 = { 'configure_logger': 거짓})' – Imjohsep

관련 문제