2017-09-28 1 views
0

Je suis en train de configurer mon application flacon en utilisant la dictConfig et la configuration de l'enregistrement des sqlalchemy, etc.problèmes d'exploitation forestière avec flacon de python

J'ai un fichier YAML comme ci-dessous

version: 1 

root: 
    handlers: [console] 
    level: INFO 


loggers: 
    sqlalchemy.engine: 
    level: WARN 
    propagate: false 
    handlers: [] 
    clportal: 
    level: INFO 
    handlers: [console] 
    propagate: false 

handlers: 
    console: 
    class: logging.StreamHandler 
    formatter: standard 
    level: INFO 
    stream: ext://sys.stdout 

formatters: 
    standard: 
    format: '%(asctime)s %(levelname)-8s %(name)-10s: %(message)s' 

qui je me connecte en faisant la suivant:

def create_app(): 
    app = Flask('clportal') 
    configure_logging() 
    app.logger.info('from app.logger') 
    app.config.from_pyfile('config.py') 
    app.secret_key = app.config["SECRET_KEY"] 
    finjector = FlaskInjector(app=app, modules=[ConfigurationModule(app)]) 
    app.injector = finjector 
    #app.logger.setLevel(app.config['LOG_LEVEL']) 
    # add stdout handler (used for docker etc) 
    #stdout_handler = logging.StreamHandler(sys.stdout) 
    # stdout_handler.setFormatter(logging.Formatter('%(message)s')) 
    #app.logger.addHandler(stdout_handler) 
    #app.logger.info('Set up correctly now?') 
    return app 


def configure_logging(): 
    logging.config.dictConfig(yaml.load(open(os.path.join(APP_PATH, 'logconfig.yml'), 'r'))) 

Connexion via le app.logger.info, ne fonctionnera que si je commente sur ces llines dans la fonction create_app.

J'aimerais pouvoir configurer toute ma journalisation via le fichier yaml. Des idées pourquoi cela ne marche pas?

enter image description here

Répondre

0

En effet, le nom de app.logger est pas vraiment "app.logger". Si vous essayez d'imprimer app.logger.name, vous trouverez son vrai nom. Et vous devez utiliser ce nom dans logconfig.yml tels que:

loggers: 
    sqlalchemy.engine: 
    level: WARN 
    propagate: false 
    handlers: [] 
    real_name: 
    level: INFO 
    handlers: [console] 
    propagate: false 

Ou vous pouvez utiliser un enregistreur personnalisé pour remplacer enregistreur par défaut:

# python scirpt 
logger = logging.getLogger("what_ever_you_want") 
app.logger = logger 

# logconfig.yml 
loggers: 
    sqlalchemy.engine: 
    level: WARN 
    propagate: false 
    handlers: [] 
    what_ever_you_want: 
    level: INFO 
    handlers: [console] 
    propagate: false 
+0

Merci @sraw J'ai mis le nom correctement, mais toujours pas de dés. Ajouté une capture d'écran ci-dessus pour voir ce qui est réellement là. Semble avoir été en quelque sorte écrasé? – Cameron

+0

@Cameron Donc, je pense que vous avez déjà résoudre ce problème? Est-ce que ça vous dérange d'accepter ma réponse? – Sraw

0

Je l'ai essayé de le faire comme la première étape par http://flask.pocoo.org/docs/dev/logging/ mais ça ne marchera pas pour moi. Au lieu de cela j'ai trouvé pour faire ce qui suit. Lancez les loggers par défaut en accédant à app.logger avec une instruction, puis exécutez la journalisation de configuration en utilisant le fichier yaml et tout sera bon. Si j'ai fait la configuration via yaml avant la création de l'application, comme spécifié dans l'aide, elle ne remplacera pas les gestionnaires par défaut.

def create_app(): 
    app = Flask('clportal') 
    app.logger.info('initing app.logger') 
    logging.config.dictConfig(yaml.load(open(os.path.join(APP_PATH, 'logconfig.yml'), 'r'))) 
    app.logger.info('app logger has now been reset') 
    app.config.from_pyfile(os.path.join(APP_PATH, 'config.py')) 
    app.secret_key = app.config["SECRET_KEY"] 
    finjector = FlaskInjector(app=app, modules=[ConfigurationModule(app)]) 
    app.injector = finjector 
    return app 

if __name__ == '__main__': 
    create_app().run() 

et mon travail yaml

version: 1 
disable_existing_loggers: true 
root: 
    handlers: [console] 
    level: INFO 


loggers: 
    sqlalchemy.engine: 
    level: WARN 
    propagate: false 
    handlers: [] 
    clportal: 
    level: INFO 
    handlers: [console] 
    propagate: false 

handlers: 
    console: 
    class: logging.StreamHandler 
    formatter: standard 
    level: INFO 
    stream: ext://sys.stdout 

formatters: 
    standard: 
    format: '%(asctime)s %(levelname)-8s %(name)-10s: %(message)s'