Hallo,
http://docs.gunicorn.org/en/stable/settings.html#accesslog sagt mir, dass '-'
an stderr ausgegeben wird, aber wir bevorzugen STDOUT für Protokollierungszwecke. Gibt es eine Möglichkeit, das zu tun?
Danke!
Die relevante Zeile ist hier: https://github.com/benoitc/gunicorn/blame/master/gunicorn/glogging.py#L335 logging.StreamHandler()
ist standardmäßig sys.stderr
. Vielleicht könnten wir accesslog so ändern, dass es "stdout" und "stderr" als gültige Werte akzeptiert und an logging.StreamHandler()
übergibt.
Eine andere, aber weniger flexible Lösung:
Der Konsolen-Handler druckt bereits auf sys.stdout
: https://github.com/benoitc/gunicorn/blob/master/gunicorn/glogging.py#L64 Wir könnten den Handler für gunicorn.accesslog
auf „console“ setzen gunicorn.error
in https://github.com/benoitc/gunicorn/blob/master/gunicorn/glogging.py#L55 getan haben
Ich bin verwirrt. Meldet sich der StreamHandler nicht bereits bei sys.stdout an?
Nein, der Standardwert ist sys.stderr
: https://github.com/python/cpython/blob/master/Lib/logging/__init__.py#L955
Okay, ich verstehe jetzt. Ursprünglich haben wir Protokolle auf stdout gedruckt. IMO sollte das Zugriffsprotokoll standardmäßig STDOUT sein. Die Gedanken?
@benoitc :+1:
Zugriffsprotokoll auf stdout
Fehlerprotokoll auf stderr
Gibt es Neuigkeiten zu dieser Anfrage?
@benoitc Ich bin mir nicht sicher, ob dieser Commit dieses Problem anspricht. Nehmen wir an, ich führe gunicorn myapp:app
ohne zusätzliche Argumente aus. Ist die Erwartung, dass Gunicorn Zugriffsdatensätze in der Standardausgabe protokollieren sollte? Wenn ja, tut Gunicorn das nicht.
In https://github.com/benoitc/gunicorn/blob/master/gunicorn/glogging.py#L302 ohne Befehlszeilenargumente ist self.cfg.accesslog
None
und die Funktion kehrt früh zurück. Soweit ich das beurteilen kann, scheint es keine Möglichkeit zu geben, sich bei stdout anzumelden, ohne --log-config
oder --log-syslog
anzugeben. Ist das richtig?
Standardmäßig ist das Zugriffsprotokoll deaktiviert, wenn Sie das meinen?
@benoitc Ja. Die obige Diskussion scheint darauf hinzudeuten, dass Zugriffsprotokolle nach stdout und Fehlerprotokolle nach stderr gehen. Es sieht jedoch so aus, als wäre die Zugriffsprotokollierung standardmäßig deaktiviert.
Übrigens, mit Python 2.7 konnte ich früher --access-log /dev/stdout --error-log /dev/stderr
machen und das würde funktionieren. Bei Python 3 schlägt die Übergabe /dev/stdout
als Argument in https://github.com/benoitc/gunicorn/blob/f722a6eb65e51407c420ac3d6be72d03bd773ad0/gunicorn/util.py#L498 fehl
👍 @suriya Ich denke, ich suche nach dem gleichen Verhalten wie Sie - ich würde gerne --capture-log
ausführen und $#$ --access-logfile=<something>
$#$ aktivieren, aber ich würde es vorziehen, wenn meine Zugriffsprotokollzeilen auf stdout gehen nicht stderr.
BEARBEITEN: Zur Verdeutlichung scheint dies nur ein Problem mit Python3 zu sein. Bei Verwendung von python3.5.1 kann das Übergeben --access-logfile=/dev/stdout
an gunicorn den Server nicht starten.
Ja, anscheinend ist die Zugriffsprotokollierung standardmäßig deaktiviert.
@huoxy Mehr als das, was der Standardwert ist, denke ich, dass das Problem eher darin besteht, dass es keine einfache Möglichkeit gibt, Zugriffsprotokolle in die Standardausgabe zu schreiben.
@huoxy ˋ--access-logfile=-` sollte funktionieren. Lassen Sie mich wissen, wenn nicht.
@huoxy https://github.com/huoxy Mehr als das, was der Standardwert ist, denke ich
Das Problem ist eher, dass es keine einfache Möglichkeit gibt, Zugriffsprotokolle zu schreiben
Standardausgabe.—
Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/benoitc/gunicorn/issues/1184#issuecomment -235501347,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AAA4oj67GbLqwaJaCQ9NOH7-iAXJoMxGks5qZv9fgaJpZM4HHW4G
.
auch ist es wahrscheinlich ein Doc-Problem. aber das Zugriffsprotokoll muss auf stdout gedruckt werden
wenn -
verwendet wird. ansonsten ist es ein bug. Gib mir Bescheid...
Am Mittwoch, den 27. Juli 2016 um 09:03 Uhr schrieb Benoit Chesneau [email protected] :
@huoxy ˋ--access-logfile=-` sollte funktionieren. Lassen Sie mich wissen, wenn nicht.
- benoît
Am Mittwoch, 27. Juli 2016 um 08:49, Suriya Subramanian [email protected]
schrieb:@huoxy https://github.com/huoxy Mehr als das, was der Standardwert ist, denke ich
Das Problem ist eher, dass es keine einfache Möglichkeit gibt, Zugriffsprotokolle zu schreiben
Standardausgabe.—
Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/benoitc/gunicorn/issues/1184#issuecomment -235501347,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AAA4oj67GbLqwaJaCQ9NOH7-iAXJoMxGks5qZv9fgaJpZM4HHW4G
.
@benoitc Wie in #1293 erwähnt, protokolliert gunicorn --access-log -
Zugriffe auf Standardfehler. Ich habe es mit gunicorn --access-log=-
versucht und das Protokoll geht immer noch zum Standardfehler.
demzufolge:
https://github.com/gunicorn/gunicorn/blob/master/gunicorn/glogging.py#L58
Der Standard-Logger ist console
, der auf stdout ausgegeben wird. Wenn Sie also alles wie ich auf stdout benötigen, können Sie diese Optionen einfach leer lassen, damit alles zum Gunicorn-Protokollierungstreiber gelangt.
Die Lösung, die ich vorschlagen würde, besteht außerdem darin, einen symbolischen Link für die Protokolldateien zu /dev/stdout
oder /dev/stderror
zu erstellen, wenn dies nicht direkt funktioniert:
ln -sf /var/log/gunicorn.access.log /dev/stdout
ln -sf /var/log/gunicorn.error.log /dev/stdout
exec newrelic-admin run-program gunicorn --chdir /usr/src/app --name nexchange --bind 0.0.0.0:${GUNICORN_PORT} --workers 3 --log-level=info --log-file=/var/log/gunicorn.error.log --access-logfile=/var/log/gunicorn.access.log nexchange.wsgi:application "$@"
Ich bin gerade zu Gunicorn 19.7.0 gewechselt, das letzte Woche veröffentlicht wurde. Leider kann ich das Zugriffsprotokoll immer noch nicht auf etwas anderes als stderr schreiben lassen.
Ich habe versucht, Gunicorn ohne Optionen auszuführen und auch mit allen Permutationen, "--access-logfile=- --error-logfile=- --log-level=DEBUG" einzuschließen/nicht einzuschließen.
Übersehe ich etwas Grundlegendes über Gunicorns Protokollierung? Blutet möglicherweise etwas aus meiner Umgebung oder von Django über und verursacht dieses Problem?
Mit der Anwendungsdatei myapp.py habe ich folgendes versucht.
$ python --version
Python 3.5.2
$ gunicorn --version
gunicorn (version 19.7.0)
$ gunicorn --access-logfile - myapp:app
Ich kann bestätigen, dass die Ausgabe des Zugriffsprotokolls an stdout
geht.
Ich bin auf Python 2.7.14. (Irgendwie habe ich die schnelle Antwort vor Monaten verpasst.)
Sie können auch accesslog = "-"
in Ihrer gunicorn.config.py verwenden
Hilfreichster Kommentar
Mit der Anwendungsdatei myapp.py habe ich folgendes versucht.
Ich kann bestätigen, dass die Ausgabe des Zugriffsprotokolls an
stdout
geht.