2010-05-16 3 views
9

GoogleAppEngineLauncher может отображать локальный файл журнала моего приложения во время его работы на моем Mac во время разработки. Тем не менее, я не могу изменить размер шрифта там, поэтому я хотел бы использовать команду tail для просмотра самого файла журнала.Где GoogleAppEngineLauncher хранит локальные файлы журналов?

Это позор, но я не могу найти файлы журнала. Они не находятся под /var/log/, ~/Library/Logs или /Library/Logs. Вы знаете, где они?

(Может быть, нет никаких физических файлов, только стандартного вывода среды разработки питона и поэтому журнал доступен только в приложении запуска.)

ответ

8

Как догадка, и может подтвердить, изучая исходный файл /usr/local/google_appengine/google/appengine/tools/dev_appserver.py , журналы не записываются на диск (a cStringIO.StringIO экземпляр используется для хранения их в памяти, так как остальная часть кода равна, ориентированная на запись их «в файл-подобный объект»).

То, что я рекомендовал бы писать свой собственный сценарий сервер приложений, который импортирует dev_appserver, подклассы dev_appserver.ApplicationLoggingHandler и перекрывает только один метод:

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() 

Кроме того, необходимо обеспечить этот класс используется вместо стандартный, например путем подклассификации диспетчера или обеспечения использования возможности его впрыскивания. (dev_appserver_main.py позволяет вам контролировать это лучше, я думаю).

Я думаю, что этот подход к настройке гораздо более громоздкий, чем должен быть (совершенно нормально, чтобы журналы, написанные в файл, в конце концов - либо отображали их по-другому, как вы хотите, либо обрабатывали их позже с некоторыми вспомогательный скрипт), поэтому я также рекомендую разместить запрос функции на трекер приложения: dev_appserver.py должен принять еще один флаг, который, если задан, дает путь для записи журналов на диск.

И, если честно, если бы мне была нужна эта функция прямо сейчас, я бы сделал это грязным способом: отредактировал файл .py (и связанный с ним _main.py), чтобы добавить указанный флаг и его использование. Это должно быть дюжина строк, намного проще, чем «канонический» способ, который я только что изложил. Конечно, это - грязный, потому что каждый раз, когда появляется новый SDK, вам придется снова применить патч, и снова и снова ... вот почему нужно также предложить патч на трекер GAE, так как часть запроса художественному предложил я, надеясь, что он получает принято в ближайшее время -)

+1

Поскольку для этого требуется запустить сценарий самостоятельно (а не через пусковую установку), вы можете просто запустить " dev_appserver.py <...> | tee logfile " –

4

простое, а также грязное, исправление добавить следующий код в файл dev_appserver.py, по направлению к верхнему:

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

Очевидно, измените свой файл журнала на то, что вы хотите. Это требует наименьшего количества изменений, и это легче всего сделать в вашем репо и diff, когда есть новый выпуск.

Update: Немного лучше бы сделать это в опции командной строки:

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

Если вы просто хотите увидеть журналы во время выполнения, они напечатаны в командной строке наряду с HTTP-вызовами.

logging.debug() и logging.error() не распечатываются, но звонки info вверх.

См. this answer для получения более подробной информации.

5

Многие из этих ответов устарели. :)

В сегодняшнем devappserver используйте --logs_path=LOGS_FILE, если вы хотите войти в систему (в своем базовом формате базы данных sqlite). Или, как указано в комментарии, просто проведите вывод, если это слишком сложно.

Поскольку есть API-интерфейс журнала, он фактически хранит записи журнала в файле в --storage_path, если не установлен. Я сам заметил несколько ошибок. (Я предполагаю, что они не существуют сейчас, прошло некоторое время с тех пор, как я использовал это.)

+0

Когда я это делаю, материал SQLLite3 хранится в файле, указанном в --logs_path (я не хочу, чтобы SQLLite3-материал, я не знаю, что это такое), но журналы, которые я хочу записываются в bash stdout (поэтому, поскольку Nick Johnson предлагает мне работы). Также что такое -storage_path? И какие ошибки вы заметили? Спасибо. –

+0

Трубопроводы отлично работают. Материал sqlite3 * - это данные журнала, хотя я думаю, что это мог быть текст раньше. См. Http://stackoverflow.com/questions/24226078/how-to-decode-the-persisted-log-files-from-app-engines-python-dev-server или используйте приложение, например, в https: // www.google.ca/search?q=sqlite%20osx - Я отредактировал свой ответ, чтобы отразить ваш комментарий. Благодаря! :) –

+0

Задумчивый ответ, спасибо. Последний комментарий, даже конвейер не работал, материал журнала просто был напечатан непосредственно в shell (console?). Есть идеи об этом? Это вопрос «TTY»? Я использую Git Bash для Windows, и тот же вопрос пытается подключиться к обычным Windows Cmd. Спасибо +1. –