рдлреНрд▓рд╛рд╕реНрдХ рдХреЗ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХреЗ рд╕рдВрджреЗрд╢ рдЬреИрд╕реЗ рдХрд┐ 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)
рдпрд╣ рдЧрдирд┐рдХреЛрд░реНрди рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░рддрд┐ рдЕрдиреБрд░реЛрдз рдмрдВрджред рдзрдиреНрдпрд╡рд╛рдж!
рдХреНрдпрд╛ рдЧрдирд┐рдХреЛрд░реНрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрд╕рдЯреАрдбреАрдИрдЖрд░рдЖрд░ рд╕реЗ рд▓реЙрдЧ рдЙрдард╛рддрд╛ рд╣реИ?
@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 рдХреЛ рд▓реЙрдЧ рдХрд░рдирд╛ рдЕрднреА рднреА рд╕рдВрднрд╡ рд╣реИ?
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдлреНрд▓рд╛рд╕реНрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░реЛрдбрдХреНрд╢рди рдореЛрдб рдореЗрдВ рд▓реЙрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдкрд░реНрдпрд╛рд╡рд░рдг (http://flask.pocoo.org/docs/errorhandling/) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИред рдЧрдирд┐рдХреЛрд░реНрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреНрд▓рд╛рд╕реНрдХ рдХрд╛ рдРрдк.рд▓реЙрдЧрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд▓реЙрдЧрд┐рдВрдЧ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ gunicorn рдХреЗ stderr рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рд╣реИ:
рдпрд╣ рдЧрдирд┐рдХреЛрд░реНрди рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред