2017-10-20 48 views
0

Je vous connecter à un fichier journal dans une application Flask sous gunicorn et nginx en utilisant la configuration suivante:Connexion une application Flask sur sever à distance ne fonctionne pas

def setup_logging(): 
    stream_handler = logging.StreamHandler() 
    formatter = logging.Formatter('[%(asctime)s][PID:%(process)d][%(levelname)s][%(name)s.%(funcName)s()] %(message)s') 
    stream_handler.setFormatter(formatter) 
    stream_handler.setLevel("DEBUG") 
    logging.getLogger().addHandler(stream_handler) 

    file_handler = RotatingFileHandler("log.txt", maxBytes=100000, backupCount=10) 
    file_handler.setFormatter(logging.Formatter(
       '%(asctime)s %(levelname)s: %(message)s ' 
       '[in %(pathname)s:%(lineno)d]' 
       )) 
    file_handler.setLevel("DEBUG") 
    logging.getLogger().addHandler(file_handler) 
    logging.getLogger().setLevel("DEBUG") 

inializing ensuite vous connecter avant de créer l'application:

setup_logging() 

def create_app(config_name): 
    app = Flask(__name__) 

Puis, en modules Je suis hélidébardage au moyen:

import logging 
logger = logging.getLogger(__name__) 

x = 2 
logger.debug('x: {0}' x) 

Logging fonctionne bien sur ma machi locale ne - à la fois la sortie standard et log.txt

Cependant quand je lance l'application sur un rien de serveur distant sont écrites sur log.txt. J'ai été déployé en tant qu'utilisateur avec une autorisation de lecture et d'écriture sur log.txt sur le système distant.

J'ai essayé d'initialiser l'application sur le serveur distant avec DEBUG = True, toujours rien écrit dans le fichier journal. La seule façon que je peux obtenir voir les journaux est en visionnant des fichiers /var/log/supervisor/app-stdout---supervisor-nnn.log mais ceux-ci DonT afficher toutes les sorties d'enregistrement

En utilisant la réponse de HolgerShurig ici Flask logging - Cannot get it to write to a file sur le fichier journal du serveur, je ne reçois que le nom de sortie de l'enregistreur (ie pas de sortie de l'enregistrement au niveau du module)

2017-10-21 00:32:45,125 - file - DEBUG - Debug FILE 

machine locale en cours d'exécution même code lo je reçois

2017-10-21 08:35:39,046 - file - DEBUG - Debug FILE 
2017-10-21 08:35:42,340 - werkzeug - INFO - * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) ie 
2017-10-21 08:38:46,236 [MainThread ] [INFO ] 127.0.0.1 - - [21/Oct/2017 08:38:46] "[37mGET /blah/blah HTTP/1.1[0m" 200 - 

J'ai alors changé la configuration de l'exploitation forestière à:

def setup_logging(app): 
    stream_handler = logging.StreamHandler() 
    formatter = logging.Formatter('[%(asctime)s][PID:%(process)d][%(levelname)s][%(lineno)s][%(name)s.%(funcName)s()] %(message)s') 
    stream_handler.setFormatter(formatter) 
    stream_handler.setLevel(Config.LOG_LEVEL) 
    app.logger.addHandler(stream_handler) 

    file_handler = RotatingFileHandler(Config.LOGGING_FILE, maxBytes=Config.LOGGING_MAX_BYTES, backupCount=Config.LOGGING_BACKUP_COUNT) 
    file_handler.setFormatter(logging.Formatter(
       '%(asctime)s %(levelname)s: %(message)s ' 
       '[in %(pathname)s:%(lineno)d]' 
       )) 
    file_handler.setLevel(Config.LOG_LEVEL) 
    loggers = [app.logger] 
    for logger in loggers: 
      logger.addHandler(file_handler) 

    app.logger.setLevel(Config.LOG_LEVEL) 
    app.logger.debug('this message should be recorded in the log file') 

et mis à nous ce juste après avoir créé l'application Flask:

setup_logging(app) 

I chaque module, je suis encore en utilisant

import logging 
logger = logging.getLogger(__name__) 

#for example 
def example(): 
    logger.debug('debug') 
    logger.info('info') 
    logger.warn('warn') 

Quand je lance l'application sur ther serveur avec

gunicorn manage:app 

la seule chose imprimée dans le fichier log.txt est

2017-10-21 02:48:32,982 DEBUG: this message should be recorded in the log file [in /../../__init__.py:82] 

Mais localement MainThread processeses sont présentés ainsi

Toutes les idées?

+0

Comment utilisez-vous l'application sur la machine locale et la machine distante? Vous utilisez le serveur de développement ('flask run') ou utilisez-vous un serveur Web (par exemple, fastcgi dans lighttpd ou apache)? – dlasalle

+0

Sur local utilisant serveur intégré, sur la télécommande via gunicorn + nginx – proximacentauri

Répondre

1

Si votre configuration fonctionne sur votre machine locale et ne fonctionne pas sur votre serveur distant, votre problème est sur l'autorisation, en ce qui concerne le fichier ou le répertoire dans lequel le fichier journal réside.

est ici something qui pourrait vous aider.

En outre, voici une Gist qui pourrait donner une autre perspective sur la configuration de l'enregistrement pour les applications Flask.

+0

Les autorisations sont très bien, et le fichier journal.txt est créé lorsque je démarre l'application. Il ne suffit pas d'écrire la sortie dans le fichier – proximacentauri

+1

@proximacentauri Si vous êtes sûr que l'autorisation (dossier parent, fichier + w, propriétaire, etc.), vous avez un problème avec la configuration de la journalisation. – ivanleoncz

+0

Oui, la journalisation au niveau du module semble être annulée, j'ai mis à jour la question avec plus d'info – proximacentauri