После развертывания приложения (состоящего из spring boot и kotlin) в Google App Engine я могу использовать
$ gcloud app logs tail для отслеживания последних журналов:
Но он не показывает журналы, выводимые приложениями.
Мне нужно использовать браузер, чтобы перейти на 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 в образце браузера:
Меня интересует только часть, обведенная красным. Но не выводится в gcloud app logs tail




Журналы ваших приложений должны поступать в поток stdout, который вы можете выбрать с помощью опции --logs команды gcloud app logs tail.
gcloud app logs tail --logs=stdout
См .: https://cloud.google.com/sdk/gcloud/reference/app/logs/tail
Да, я упомянул I have to use browser to go to StackDriver to browse online logs . This is not convenient.. В нем много полезной нагрузки.
Итак, в каком потоке журнала отображаются в браузере? Это stdout? В этом случае вы говорите, что в gcloud есть ошибка. Верный?
Я добавил снимок StackDriver, к вашему сведению. <stdout> есть, но gcloud app logs tail не выводит
Попробуйте версию инструмента бета!
С чем-то вроде gcloud beta app logs tail --project=... --logs=stdout,stderr я получаю ожидаемые следы от моего живого кода.
Это немного взломано, но вы можете:
watch -n 1 для запуска команды каждую секунду (обходной путь в виде хвоста)gcloud logging read "request_log" --limit=10 --format=json, чтобы отформатировать его как json, чтобы затем можно было проанализировать его с помощью jqjq ".[].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 или будущим членам сообщества понять проблему или предлагаемое решение.
Извините, это не работает. Фактически,
--logsпо умолчанию содержитstderr,stdout,crash.log,nginx.request,request_log.