Хвост журналов приложения GAE включает журнал приложения, а не только журнал HTTP-запросов

После развертывания приложения (состоящего из spring boot и kotlin) в Google App Engine я могу использовать $ gcloud app logs tail для отслеживания последних журналов:

Хвост журналов приложения GAE включает журнал приложения, а не только журнал HTTP-запросов

Но он не показывает журналы, выводимые приложениями. Мне нужно использовать браузер, чтобы перейти на StackDriver и просмотреть онлайн-журналы. Это не удобно.

Другой способ - использовать командную строку для чтения request_log командой gcloud logging:

gcloud logging read request_log --limit=10

Но он не поддерживает режим tail и выводит слишком много данных полезной нагрузки (таких как метки, requestId, зона ... мля ...). Я пробовал много форматов, но все равно выводил слишком много полезной нагрузки.

Я просто хочу посмотреть, что выводит logger.info("...") или более высокий уровень

Есть ли способ для gcloud app logs tail также выводить журналы по приложениям? Или каким-либо другим способом вести журнал приложения хвост (monitor) в консоли?

Код регистрации прост (от slf4j):

@RestController
class WebhookController {

  val logger = LoggerFactory.getLogger(javaClass)!!

  @GetMapping("/")
  fun index(req: HttpServletRequest): String {
    logger.info("header : ")
    for (headerName in req.headerNames) {
      logger.info("\t{} = {}", headerName, req.getHeader(headerName))
    }
    logger.info("params : ")
    req.parameterMap.forEach { (k, v) ->
      logger.info("\t{} = {}", k, v)
    }
    return "Hello Spring Boot Kotlin "
  }
}

Среда :

logging.properties

.level = INFO
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=INFO

appengine-web.xml

<appengine-web-app xmlns = "http://appengine.google.com/ns/1.0">
  <version>1</version>
  <threadsafe>true</threadsafe>
  <runtime>java8</runtime>
  <system-properties>
    <property name = "java.util.logging.config.file" value = "logging.properties"/>
  </system-properties>
</appengine-web-app>

а также

Google Cloud SDK 220.0.0
app-engine-java 1.9.66
<kotlin.version>1.2.71</kotlin.version>
<springboot.version>2.0.5.RELEASE</springboot.version>
<spring.version>5.0.8.RELEASE</spring.version>

обновлено: StackDriver в образце браузера: Хвост журналов приложения GAE включает журнал приложения, а не только журнал HTTP-запросов Меня интересует только часть, обведенная красным. Но не выводится в gcloud app logs tail

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
1 104
4

Ответы 4

Журналы ваших приложений должны поступать в поток stdout, который вы можете выбрать с помощью опции --logs команды gcloud app logs tail.

gcloud app logs tail --logs=stdout

См .: https://cloud.google.com/sdk/gcloud/reference/app/logs/tail

Извините, это не работает. Фактически, --logs по умолчанию содержит stderr,stdout,crash.log,nginx.request,request_log.

smallufo 17.10.2018 05:01

Да, я упомянул I have to use browser to go to StackDriver to browse online logs . This is not convenient.. В нем много полезной нагрузки.

smallufo 18.10.2018 19:46

Итак, в каком потоке журнала отображаются в браузере? Это stdout? В этом случае вы говорите, что в gcloud есть ошибка. Верный?

Mike E. 19.10.2018 04:30

Я добавил снимок StackDriver, к вашему сведению. <stdout> есть, но gcloud app logs tail не выводит

smallufo 19.10.2018 09:44

Попробуйте версию инструмента бета!

С чем-то вроде gcloud beta app logs tail --project=... --logs=stdout,stderr я получаю ожидаемые следы от моего живого кода.

Это немного взломано, но вы можете:

  1. Используйте watch -n 1 для запуска команды каждую секунду (обходной путь в виде хвоста)
  2. Используйте gcloud logging read "request_log" --limit=10 --format=json, чтобы отформатировать его как json, чтобы затем можно было проанализировать его с помощью jq
  3. Передайте вывод в jq, чтобы он печатал только сообщение журнала вместо всех других данных полезной нагрузки, например jq ".[].protoPayload.line | .[] | .logMessage"

Таким образом, полная команда будет такой:

watch -n 1 'gcloud logging read "request_log" --limit=10 --format=json | jq ".[].protoPayload.line | .[] | .logMessage"'

Итак, если запись в журнале такая:

[
  {
    "httpRequest": {
      "status": 200
    },
    ...,
    "protoPayload": {
      "@type": "type.googleapis.com/google.appengine.logging.v1.RequestLog",
      ...
      "line": [
        {
          "logMessage": "This is an info message",
          "severity": "INFO",
          ...

        }
      ]
    }
    ...
  }
]

Тогда с jq ".[].protoPayload.line | .[] | .logMessage" вы получите только это:

"This is an info message"

Вы также можете добавить .time, чтобы получить метку времени сообщения журнала:

jq ".[].protoPayload.line | .[] | .logMessage ,.time"

Я использую laravel, и у меня такая же проблема. Наконец, добавляю в свой app.yaml Добавить

env_variables:
    ...
    LOG_CHANNEL: stderr

И это помогает мне отслеживать такие журналы приложений:

Log::info( $data );

И как рекомендация, $ data должен быть похож на JSON - для удобства чтения через консоль.

Пожалуйста, подумайте о добавлении некоторых пояснений или деталей к своему ответу. Хотя он может ответить на вопрос, простое добавление фрагмента кода в качестве ответа, по сути, не поможет OP или будущим членам сообщества понять проблему или предлагаемое решение.

Maxim 22.01.2020 10:59

Другие вопросы по теме