Как просмотреть журналы JSON управляемой ВМ в средстве просмотра журналов?

Я пытаюсь получить журналы в формате JSON на экземпляре виртуальной машины Compute Engine, чтобы они отображались в средстве просмотра журналов консоли разработчика Google. Согласно этой документации, это должно быть возможно:

Приложения, использующие виртуальные машины, управляемые App Engine, должны записывать настраиваемые файлы журналов в каталог журналов виртуальной машины по адресу /var/log/app_engine/custom_logs. Эти файлы автоматически собираются и становятся доступными в средстве просмотра журналов.

Пользовательские файлы журналов должны иметь суффикс .log или .log.json. Если используется суффикс .log.json, журналы должны быть в формате JSON с одним объектом JSON в строке. Если используется суффикс .log, записи журнала обрабатываются как обычный текст.

У меня это не работает: журналы, оканчивающиеся на .log, видны в средстве просмотра журналов, но отображаются как обычный текст. Журналы, заканчивающиеся на .log.json, вообще не видны.

Это также противоречит другой недавней статье, в которой говорится, что имена файлов должны заканчиваться на . log и его содержимое обрабатываются как обычный текст.

Насколько я могу судить, Google использует fluent для индексации файлов журналов в средстве просмотра журналов. В репозитории GitHub я не могу найти доказательств того, что файлы .log.json индексируются.

Кто-нибудь знает, как заставить это работать? Или документация устарела и по какой-то причине эта функция была удалена?




Ответы (2)


Вот один из способов создания журналов JSON для средства просмотра журналов управляемых виртуальных машин:

Желаемый формат JSON

Цель состоит в том, чтобы создать объект JSON с одной строкой для каждой строки журнала, содержащий:

{
    "message": "Error occurred!.",
    "severity": "ERROR",
    "timestamp": {
        "seconds": 1437712034000,
        "nanos": 905
    }
}

(информация получена от Google: https://code.google.com/p/googleappengine/issues/detail?id=11678#c5)

Использование python-json-логгера

См.: https://github.com/madzak/python-json-logger.

def get_timestamp_dict(when=None):
    """Converts a datetime.datetime to integer milliseconds since the epoch.

    Requires special handling to preserve microseconds.

    Args:
        when:
            A datetime.datetime instance. If None, the timestamp for 'now'
            will be used.

    Returns:
    Integer time since the epoch in milliseconds. If the supplied 'when' is
    None, the return value will be None.
    """
    if when is None:
        when = datetime.datetime.utcnow()

    ms_since_epoch = float(time.mktime(when.utctimetuple()) * 1000.0)
    return {
        'seconds': int(ms_since_epoch),
        'nanos': int(when.microsecond / 1000.0),
    }

def setup_json_logger(suffix=''):
    try:

        from pythonjsonlogger import jsonlogger

        class GoogleJsonFormatter(jsonlogger.JsonFormatter):

            FORMAT_STRING = "{message}"

            def add_fields(self, log_record, record, message_dict):
                super(GoogleJsonFormatter, self).add_fields(log_record,
                                                            record,
                                                            message_dict)

                log_record['severity'] = record.levelname
                log_record['timestamp'] = get_timestamp_dict()
                log_record['message'] = self.FORMAT_STRING.format(
                                            message=record.message,
                                            filename=record.filename,
                                            )

        formatter = GoogleJsonFormatter()

        log_path = '/var/log/app_engine/custom_logs/worker'+suffix+'.log.json'
        make_sure_path_exists(log_path)
        file_handler = logging.FileHandler(log_path)

        file_handler.setFormatter(formatter)
        logging.getLogger().addHandler(file_handler)

    except OSError:
        logging.warn("Custom log path not found for production logging")

    except ImportError:
        logging.warn("JSON Formatting not available")

Чтобы использовать, просто вызовите setup_json_logger - вы также можете изменить имя worker для своего журнала.

person Josh    schedule 23.07.2015
comment
Спасибо, Джош! Я еще не пробовал ваш ответ, но я отмечаю его как ответ, пока не сделаю этого. В системе отслеживания проблем движка приложения вы упоминаете много пустых журналов. Значит ли это, что с ним все еще есть проблемы? - person Arjen; 24.07.2015
comment
@Арьен, ты прав. Я опубликовал это, потому что это был ответ Google, и он должен работать именно так. Я обновлю ответ по мере того, как продолжаю продвигаться вперед. - person Josh; 25.07.2015

В настоящее время я работаю над приложением NodeJS, работающим на управляемой виртуальной машине, и я также пытаюсь распечатать свои журналы в консоли разработчика Google. Я создал файлы журнала в каталоге «/var/log/app_engine», как описано в документации. К сожалению, у меня это не работает, даже для файлов «.log».

Не могли бы вы описать, где создаются ваши журналы? Кроме того, ваша управляемая виртуальная машина настроена как «Управляемая Google» или «Управляемая пользователем»? Спасибо!

person Q_C    schedule 17.03.2015
comment
Мы записываем наши логи в директорию /var/log/app_engine/custom_logs. Чтобы упростить тестирование, вы можете подключиться по SSH к экземпляру виртуальной машины, затем использовать docker для запуска приглашения bash в работающем образе, а затем создать файл /var/log/app_engine/custom_logs/app.log с некоторыми тестовыми данными. Неважно, управляется ли ваша виртуальная машина Google или пользователем. - person Arjen; 17.03.2015
comment
Спасибо большое Арьен! Моя проблема заключалась в том, что я забыл запустить приглашение bash с помощью Docker. Я тестировал в управляемой виртуальной машине, а не в контейнере... Кстати, вот команды для запуска приглашения докера: docker ps для получения идентификатора, а затем docker exec -i -t ‹ID› bash. Я также могу подтвердить, что файлы .log.json не видны. - person Q_C; 18.03.2015
comment
Эта проблема была отправлена ​​в Google некоторое время назад, поставьте +1: code.google.com/p/googleappengine/issues/detail?id=11678 - person Josh; 22.07.2015