2010-05-16 7 views
9

GoogleAppEngineLauncher kann die lokale Protokolldatei meiner App anzeigen, während sie während der Entwicklung auf meinem Mac ausgeführt wird. Allerdings kann ich dort die Schriftgröße nicht ändern, daher möchte ich den Befehl tail verwenden, um die Protokolldatei selbst zu sehen.Wo behält GoogleAppEngineLauncher die lokalen Protokolldateien?

Es ist eine Schande, aber ich kann die Protokolldateien nicht finden. Sie sind nicht unter /var/log/, ~/Library/Logs oder /Library/Logs. Weißt du wo sie sind?

(Vielleicht gibt es keine physischen Dateien, sondern nur die stdout der Entwicklungsumgebung Python und so das Protokoll im Launcher-Anwendung verfügbar ist.)

Antwort

8

Wie Sie vermuten, und /usr/local/google_appengine/google/appengine/tools/dev_appserver.py durch das Studium der Quelldatei kann bestätigen, Die Protokolle werden nicht auf die Platte geschrieben (eine cStringIO.StringIO Instanz wird verwendet, um sie im Speicher zu halten, da der Rest des Codes so ausgerichtet ist, dass sie "in ein dateiähnliches Objekt" geschrieben werden).

Was würde ich empfehlen, ist Ihren eigenen App-Server-Skript zu schreiben, die dev_appserver importiert, Unterklassen dev_appserver.ApplicationLoggingHandler und überschreibt nur ein Methode:

from google.appengine.tools import dev_appserver 

class MyHandler(dev_appserver.ApplicationLoggingHandler): 

    def __init__(self, *a, **k): 
     dev_appserver.ApplicationLoggingHandler.__init__(self, *a, **k) 
     self.thefile = open('/tmp/mylog.txt', 'w') 

    def emit(self, record): 
     dev_appserver.ApplicationLoggingHandler(self, record) 
     self.thefile.write(str(record) + '\n') 
     self.thefile.flush() 

Sie müssen auch diese Klasse, um sicherzustellen, statt das verwendet wird, Standard eins, z indem Sie den Dispatcher unterklassifizieren oder sicherstellen, dass Sie die Abhängigkeitsinjektionsfunktion verwenden. (dev_appserver_main.py lässt Sie das besser kontrollieren, denke ich).

Ich denke, diese Anpassung Ansatz ist viel mühsamer als es sein sollte (es ist völlig normal, die Protokolle in Datei geschrieben, schließlich - entweder um sie unterschiedlich anzuzeigen, wie Sie es wünschen, oder später mit einigen zu verarbeiten Hilfsskript), und so würde ich auch empfehlen, eine Feature-Anfrage in Tracker der App-Engine zu setzen: dev_appserver.py sollte ein weiteres Flag akzeptieren, das, falls angegeben, den Pfad angibt, auf dem Protokolle auf die Festplatte geschrieben werden.

Und, um ehrlich zu sein, wenn ich diese Funktion im Augenblick brauchte, würde ich es auf die schmutzige Art und Weise tun: Bearbeiten dieser .py Datei (und ihre verwandte _main.py), um die Flagge und ihre Verwendung hinzuzufügen. Das sollte insgesamt ein Dutzend Zeilen sein, viel einfacher als der "kanonische" Weg, den ich gerade skizziert habe. Natürlich ist es ist schmutzig, weil jedes Mal, wenn es ein neues SDK ist, müssen Sie den Patch erneut und wieder und wieder anwenden ... weshalb sollte auch vorschlagen, das Patch auf GAE-Tracker, als Teil die Feature-Anfrage schlug ich vor, in der Hoffnung es bald angenommen wird -)

+1

Da dies erfordert, dass Sie das Skript selbst (anstatt über den Launcher) ausführen, könnten Sie einfach ausführen " dev_appserver.py <...> | tee logfile " –

4

Ein einfaches und auch schmutzig, fix ist, den folgenden Code in der Datei dev_appserver.py, nach oben hin hinzuzufügen:

import logging 
logging.basicConfig(filename='/tmp/gae.log', filemode='a') 

Offensichtlich ändern Sie Ihre Logdatei zu dem, was Sie wollen. Dies erfordert die geringste Menge an Änderungen und ist am einfachsten in Ihren Repo und Diff einzutauschen, wenn es eine neue Version gibt.

Update: Etwas besser sein könnte sie in eine Befehlszeilenoption zu machen:

def start_logging(): 
    import logging 

    logfile='' 
    for item in sys.argv[1:]: 
    if re.match('--log_file=', item): 
     logfile=item.split('=')[1] 
     # Remove this item from sys.argv 
     sys.argv.remove(item) 
     break 

    if logfile: 
    print "Please monitor the log file (with tail -f %s)" % logfile 
    logging.basicConfig(filename=logfile, filemode='a') 
0

Wenn Sie nur die Protokolle zur Laufzeit sehen wollen, sind sie auf der Kommandozeile gedruckt zusammen mit den HTTP-Anrufen.

logging.debug() und logging.error() werden nicht gedruckt, aber Anrufe info nach oben sind.

Weitere Details finden Sie unter this answer.

5

Viele dieser Antworten sind jetzt veraltet. :)

Verwenden Sie in der heutigen devappserver--logs_path=LOGS_FILE, wenn Sie in einer Datei (in seinem nativen SQLite-Datenbankformat) protokollieren möchten. Oder, wie in einem Kommentar vorgeschlagen, piped einfach die Ausgabe, wenn das zu kompliziert ist.

Da es eine Protokoll-API gibt, speichert es jetzt Protokolleinträge in einer Datei in --storage_path, wenn nicht festgelegt. Ich habe jedoch ein paar Bugs selbst bemerkt. (Ich nehme an, dass sie jetzt nicht existieren, es ist eine Weile her, seit ich das verwendet habe.)

+0

Wenn ich dies tue, wird SQLLite3 Zeug in der Datei gespeichert, die in --logs_path angegeben ist (ich will nicht SQLLite3 Zeug, ich weiß nicht, was es ist), aber die Protokolle will ich werden in die Bash Stdout geschrieben (daher Piping wie Nick Johnson vorschlägt funktioniert für mich). Auch was ist --storage_path? Welche Bugs hast du bemerkt? Vielen Dank. –

+0

Piping funktioniert auch gut. Das sqlite3-Zeug * ist * die Log-Daten, obwohl ich denke, dass es früher Text gewesen sein könnte. Siehe http://stackoverflow.com/questions/24226078/how-to-decode-the-persisted-log-files-from-app-engines-python-dev-server oder verwende eine App wie die unter https: // www.google.ca/search?q=sqlite%20osx - Ich habe meine Antwort bearbeitet, um deinen Kommentar zu reflektieren. Vielen Dank! :) –

+0

Nachdenkliche Antwort, danke. Letzter Kommentar, sogar Rohrleitungen hat nicht funktioniert, Log-Zeug wurde nur direkt auf Shell (Konsole?) Gedruckt. Irgendeine Idee dazu? Ist es ein TTY-Problem? Ich benutze Git Bash unter Windows, das gleiche Problem versucht, mit normalen Windows Cmd zu pipen. Danke +1. –

Verwandte Themen