2014-07-27 5 views
7

Ich bin eine Flask Web-App mit Gunicorn + Nginx. Ich laufe Gunicorn in daemon Modus. Ich habe Gunicorn und Nginx konfiguriert, um ihren Zugriff und Fehler auf Dateien zu protokollieren. Aber ich kann Flask-Logs einfach nicht in eine Datei bringen.Logging Arbeit für Flask kann nicht mit Gunicorn Daemon-Modus

Ich benutze eine Shell-Datei meine app mit gunicorn zu starten:

Und in meinem Kolben app ich laut doc add Anmeldung erfordert:

app.debug = False 
... 
if __name__ == '__main__': 
    if app.debug != True: 
     import logging 
     from logging.handlers import RotatingFileHandler 
     handler = RotatingFileHandler("flask.log", maxBytes=10000, backupCount=1) 
     handler.setLevel(logging.DEBUG) 
     app.logger.addHandler(handler) 
     app.logger.debug("test!!") 
    app.run() 

Ich habe auch app.logger.debug an anderen Orten .

Wenn ich gunicorn ohne --daemon starte, funktioniert die Protokolldatei einwandfrei. Aber sobald ich --daemon hinzufügen, werden keine Protokolle generiert.

Ich habe versucht, print zu verwenden, aber es funktioniert nur ohne --daemon auch.

Ich habe eine Weile gesucht und it seems Gunicorn unterstützt keine Anwendungsprotokollierung. Aber ich dachte, das Logging in eine Datei wäre in Ordnung?

Weiß jemand, wie ich mich unter meinen Einstellungen in einer Datei ausloggen könnte?

+3

Denn wer Downvoted die Frage schätze ich Ihre Bemühungen um die Qualität der Fragen hier zu halten, aber eine Erklärung wäre hilfreich gewesen. – Yulong

+0

Sofern Sie nicht Single-Server und Stateful bleiben wollen, würde ich vorschlagen, die Protokollierung in eine Datei zu vermeiden und direkt in ein Remote-Syslog oder irgendetwas anderes zu protokollieren, wenn Ihre Server zerstört und neu erstellt werden müssen. – rbanffy

Antwort

0

Ich verwende auch nginx + gunicorn + Flasche

Wie kann ich gunicorn App laufen.

myapp.ini

[server:main] 
use = egg:gunicorn#main 
daemon = True 
host = 0.0.0.0 
python = /usr/bin/python3 
port = 5005 
workers = 2 
proc_name = myapp 
backlog = 1024 
worker_class = gaiohttp 
loglevel = debug 
syslog = True 
syslog_addr = udp://log:514 
syslog_prefix = myapp 
syslog_facility = local3 
forwarded-allow-ips = 10.0.0.4, 10.0.0.8, 10.0.0.100 

[app:main] 
use = call:myapp.main:create_app 

/etc/init.d/myapp

https://gist.githubusercontent.com/vpol/95970c8c4223c12548c8/raw/0b59d659d2818e19f2c6c5112664a7e0acd9b22d/gunicorn%20init%20script 

/etc/default/MeineAnw

# Defaults for myapp initscript 
# sourced by /etc/init.d/myapp 

# make this read NO_START=0 when you're done setting up your config. 
NO_START=0 
DAEMON="/usr/bin/gunicorn" 
DAEMON_OPTS="--paste /etc/myapp/myapp.ini --preload" 
MYAPP_USER="myuser" 
MYAPP_GROUP="myuser" 

myapp/main.py

import logging 

from flask import Flask 
from werkzeug.contrib.fixers import ProxyFix 

def create_app(*args, **kwargs): 
    app = Flask('myapp') 

    # Init logging 
    from logging.handlers import SysLogHandler 

    app.logger_name = 'myapp' 
    app.logger.addHandler(SysLogHandler(address=('log', 514), facility=local5)) 
    app.logger.setLevel(debug) 
    werkzeug_logger = logging.getLogger('werkzeug') 
    werkzeug_logger.setLevel(DEBUG) 
    werkzeug_logger.addHandler(SysLogHandler(address=('log', 514), facility=local2)) 

    app.logger.debug('started myapp') 

    return ProxyFix(app) 
0

Der pythonic Weg, um einen Dämon-Prozess wird mit so etwas wie Supervisord, vergessen bash, seinem Python zu laufen. Haben Sie darüber nachgedacht, nginx als Proxy-Pass zu verwenden? Gunicorn kann mit der WSGI umgehen. Ich denke, es ist seit 1.3.13 verfügbar. Es ist für Websockets gedacht, funktioniert aber auch, wenn Sie ein http-Protokoll ausführen.

so etwas wie

server { 
    listen 80; 
    server_name localhost; 
    access_log /var/log/nginx/example.log; 

    location/{ 
     proxy_pass http://127.0.0.1:5000; 
     proxy_redirect off; 

     proxy_set_header Host $host; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 
} 
Verwandte Themen