Приложение GAE регистрирует хвост, чтобы включить журнал приложения, а не только журнал HTTP-запросов.

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

хвостовые бревна

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

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

gcloud logging read request_log --limit=10

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

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

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

Код регистрации прост (от 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 в браузере: введите здесь описание изображения Меня интересует только часть, обведенная красным кружком. Но не выводится в gcloud app logs tail


person smallufo    schedule 13.10.2018    source источник


Ответы (4)


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

gcloud app logs tail --logs=stdout

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

person Mike E.    schedule 15.10.2018
comment
Извините, это не работает. На самом деле --logs по умолчанию содержит stderr,stdout,crash.log,nginx.request,request_log . - person smallufo; 17.10.2018
comment
Да, я упомянул I have to use browser to go to StackDriver to browse online logs . This is not convenient. У него много полезной нагрузки. - person smallufo; 18.10.2018
comment
Итак, в браузере под каким потоком логов появляются логи? Это stdout? В этом случае вы говорите, что в gcloud есть ошибка. Правильный? - person Mike E.; 19.10.2018
comment
Я добавил снимок StackDriver, к вашему сведению. Есть <stdout> , но не выводится gcloud app logs tail - person smallufo; 19.10.2018

Это немного взломано, но вы можете сделать следующее:

  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"

person TasosZG    schedule 29.04.2019

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

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

person Dom Derrien    schedule 14.01.2019

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

env_variables:
    ...
    LOG_CHANNEL: stderr

И это помогает мне отслеживать журналы приложений следующим образом:

Log::info( $data );

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

person markovpavel.ru    schedule 22.01.2020
comment
Пожалуйста, рассмотрите возможность добавления некоторых пояснений или деталей к вашему ответу. Хотя это может ответить на вопрос, просто добавление фрагмента кода в качестве ответа, по сути, не помогает ОП или будущим членам сообщества понять проблему или предлагаемое решение. - person Maxim; 22.01.2020