Gunicorn: рдлреНрд▓рд╛рд╕реНрдХ рдХреЗ рдРрдк рд╕реЗ рд╕рдВрджреЗрд╢ рд▓реЙрдЧ рдХрд░реЗрдВред рд▓рдХрдбрд╝рд╣рд╛рд░рд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 19 рдЬреБрд▓ре░ 2012  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: benoitc/gunicorn

рдлреНрд▓рд╛рд╕реНрдХ рдХреЗ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХреЗ рд╕рдВрджреЗрд╢ рдЬреИрд╕реЗ рдХрд┐ app.logger.info("рдпрд╣ рдПрдХ рд╕рдВрджреЗрд╢ рд╣реИ") рдЧрдирд┐рдХреЛрд░реНрди рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рд╣реЗрдЬреЗ рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдлреНрд▓рд╛рд╕реНрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░реЛрдбрдХреНрд╢рди рдореЛрдб рдореЗрдВ рд▓реЙрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдкрд░реНрдпрд╛рд╡рд░рдг (http://flask.pocoo.org/docs/errorhandling/) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИред рдЧрдирд┐рдХреЛрд░реНрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреНрд▓рд╛рд╕реНрдХ рдХрд╛ рдРрдк.рд▓реЙрдЧрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд▓реЙрдЧрд┐рдВрдЧ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ gunicorn рдХреЗ stderr рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рд╣реИ:

import logging
import flask

app = flask.Flask(__name__)

@app.before_first_request
def setup_logging():
    if not app.debug:
        # In production mode, add log handler to sys.stderr.
        app.logger.addHandler(logging.StreamHandler())
        app.logger.setLevel(logging.INFO)

рдпрд╣ рдЧрдирд┐рдХреЛрд░реНрди рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рднреА 11 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдлреНрд▓рд╛рд╕реНрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░реЛрдбрдХреНрд╢рди рдореЛрдб рдореЗрдВ рд▓реЙрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдкрд░реНрдпрд╛рд╡рд░рдг (http://flask.pocoo.org/docs/errorhandling/) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИред рдЧрдирд┐рдХреЛрд░реНрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреНрд▓рд╛рд╕реНрдХ рдХрд╛ рдРрдк.рд▓реЙрдЧрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд▓реЙрдЧрд┐рдВрдЧ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ gunicorn рдХреЗ stderr рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рд╣реИ:

import logging
import flask

app = flask.Flask(__name__)

@app.before_first_request
def setup_logging():
    if not app.debug:
        # In production mode, add log handler to sys.stderr.
        app.logger.addHandler(logging.StreamHandler())
        app.logger.setLevel(logging.INFO)

рдпрд╣ рдЧрдирд┐рдХреЛрд░реНрди рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкреНрд░рддрд┐ рдЕрдиреБрд░реЛрдз рдмрдВрджред рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рдЧрдирд┐рдХреЛрд░реНрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрд╕рдЯреАрдбреАрдИрдЖрд░рдЖрд░ рд╕реЗ рд▓реЙрдЧ рдЙрдард╛рддрд╛ рд╣реИ?

@benoitc
рдореИрдВ рдЧрдирд┐рдХреЛрд░реНрди рдХреЛ рдПрд╕рдЯреАрдбреАрдИрдЖрд░рдЖрд░ рд╕реЗ рд▓реЙрдЧ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдмрд╛рдзреНрдп рдХрд░реВрдВ?

-R рдзреНрд╡рдЬ рд╡рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдвреВрдВрдв рд░рд╣реЗ рд╣реИрдВред

http://gunicorn-docs.readthedocs.org/en/latest/settings.html#enable -stdio-inheritance

-рдЖрд░ рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рдиреАрдЪреЗ рдореЗрд░рд╛ рд╕реЗрдЯрдЕрдк рд╣реИ

@app.route('/')
def index():
    console = logging.StreamHandler()
    log = logging.getLogger("asdasd")
    log.addHandler(console)
    log.setLevel(logging.DEBUG)
    log.error("Something")
    print >> sys.stderr, "Another thing"
    return 'ok'

рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ

gunicorn --access-logfile - --log-file /mnt/log/test.log --bind 0.0.0.0:8080 --workers 2 --worker-class gevent --log-level -D debug server:app

рдореБрдЭреЗ /mnt/log/test.log рдореЗрдВ рдЧрдирд┐рдХреЛрд░реНрди рд▓реЙрдЧ рдорд┐рд▓рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдХреЛрдИ рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдареАрдХред рдореИрдВ рдЧрд▓рдд рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓рд╛ рди рд╣реЛ
рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ stderr рдлреНрд▓рд╢ рдХрд░рдирд╛ (IIRC рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрдлрд╝рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ
рдЬрдм рдЧрдирд┐рдХреЛрд░реНрди рдХрд╛рдВрдЯреЗ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?)

рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд▓реЙрдЧ рд╕рдВрджреЗрд╢ рдХрд╣рд╛рдВ рдЬрд╛рддреЗ рд╣реИрдВ рдпрджрд┐
рдЖрдк stdio рдХреЗ рдмрдЬрд╛рдп рдЕрдЬрдЧрд░ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
26 рдЬреВрди 2014 рдХреЛ рджреЛрдкрд╣рд░ 1:39 рдмрдЬреЗ, "рдпреВрд╕реБрдл рдлреМрдЬрд╛рди" рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

-рдЖрд░ рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рдиреАрдЪреЗ рдореЗрд░рд╛ рд╕реЗрдЯрдЕрдк рд╣реИ

@ рдРрдк.рдорд╛рд░реНрдЧ ('/')
рдбреАрдИрдПрдлрд╝ рдЗрдВрдбреЗрдХреНрд╕ ():
рдХрдВрд╕реЛрд▓ = рд▓реЙрдЧрд┐рдВрдЧредрд╕реНрдЯреНрд░реАрдорд╣реИрдВрдбрд▓рд░ ()
рд▓реЙрдЧ = logging.getLogger ("asdasd")
log.addHandler (рдХрдВрд╕реЛрд▓)
log.setLevel(рд▓реЙрдЧрд┐рдВрдЧ.DEBUG)
log.error ("рдХреБрдЫ")
рдкреНрд░рд┐рдВрдЯ >> sys.stderr, "рдПрдХ рдФрд░ рдмрд╛рдд"
рд╡рд╛рдкрд╕реА 'рдареАрдХ рд╣реИ'

рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ

gunicorn --access-logfile - --log-file /mnt/log/test.log --bind 0.0.0.0:8080 --workers 2 --worker-class gevent --log-level рдбреАрдмрдЧ рд╕рд░реНрд╡рд░: рдРрдк

рдореБрдЭреЗ /mnt/log/test.log рдореЗрдВ рдЧрдирд┐рдХреЛрд░реНрди рд▓реЙрдЧ рдорд┐рд▓рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдХрд┐рд╕реА рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдирд╣реАрдВ
рд▓реЙрдЧ

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/benoitc/gunicorn/issues/379#issuecomment -47276949ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдкрд░реЗрд╢рд╛рдиреА рдкрддрд╛ рдЪрд▓ рдЧрдпрд╛ рд╣реИред рдпрд╣рд╛рдБ 19.00 рдХреЗ рд▓рд┐рдП рдЪреИрдВрдЬ рдореЗрдВ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣реИ

fix logging: donтАЩt try to redirect stdout/stderr to the logfile.

рдореИрдВрдиреЗ рдЕрднреА v18 рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ StreamHandler рдХреЗ рд▓реЙрдЧ рдХреЛ рдЧрдирд┐рдХреЛрд░реНрди рд▓реЙрдЧ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рд╡рд┐рдЪрд╛рд░?
@benoitc @tilgovi

@spicavigo gunicorn рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реЙрдЧрдлрд╛рдЗрд▓ рдкрд░ stderr рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдлрд┐рдХреНрд╕ рд╣реИрдХ рдХреЛ рд╣рдЯрд╛рдирд╛ рдерд╛ рдЬреИрд╕реЗ #591 рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереАред рдХреНрдпрд╛ рдЖрдкрдиреЗ --error-logfile=- рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬреЛ рдХрдВрд╕реЛрд▓ рдкрд░ рд▓реЙрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ?

рдпрджрд┐ рдЖрдк рддреНрд░реБрдЯрд┐ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реАрдзреЗ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЕрдВрддрддрдГ environ['wsgi.errors'] рдкрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕реЗ рд▓реЙрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ee08ac86441e36c3433849b79b3839d1425647fdред

рдзрдиреНрдпрд╡рд╛рдж @benoitc

рдореИрдВ рдЕрдм stderr рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рджреЗрд╡ рдХреЗ рдмреАрдЪ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдЖ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕рдиреЗ рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрд▓рдЭрд╛ рджрд┐рдпрд╛ред рдореИрдВ рдЧрдирд┐рдХреЛрд░реНрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдЕрдЪрд╛рдирдХ рд╕реНрдЯрдбрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдиреЗ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдХрд╛рд░рдг рдерд╛ рдФрд░ рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рдмрдЧ рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ рдерд╛ :)

@benoitc рдХреНрдпрд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд▓реЙрдЧрдлрд╛рдЗрд▓ рдореЗрдВ stderr рдХреЛ рд▓реЙрдЧ рдХрд░рдирд╛ рдЕрднреА рднреА рд╕рдВрднрд╡ рд╣реИ?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Abraxos picture Abraxos  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

alep picture alep  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gr790 picture gr790  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

agilezebra picture agilezebra  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

bywangxp picture bywangxp  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ