Где GoogleAppEngineLauncher хранит локальные файлы журнала? - PullRequest
9 голосов
/ 16 мая 2010

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

Обидно, но я не могу найти файлы журналов. Они не под /var/log/, ~/Library/Logs или /Library/Logs. Ты знаешь где они?

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

Ответы [ 4 ]

8 голосов
/ 16 мая 2010

Как вы можете догадаться и можете подтвердить, изучив исходный файл /usr/local/google_appengine/google/appengine/tools/dev_appserver.py, журналы не записываются на диск (экземпляр 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, как часть предложенного мною запроса, надеясь, что он скоро будет принят! -)

5 голосов
/ 23 декабря 2013

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

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

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

4 голосов
/ 16 марта 2011

Простое и грязное исправление заключается в добавлении следующего кода в ваш файл dev_appserver.py по направлению вверх:

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

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

Обновление: Чуть лучше сделать это параметром командной строки:

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' ) 
1 голос
/ 27 апреля 2012

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

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

См. этот ответ для более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...