Когда я просматриваю журналы в Google Log Viewer для моего проекта GAE, я вижу, что часто журналы, которые я сам пишу в коде, присваиваются неверному запросу. Большую часть времени журнал назначается запросу непосредственно после запроса, который создал запись журнала.
Поскольку root каждого журнала приложения в GAE должен быть запросом, это означает, что неправильный запрос иногда помечается как ошибка, потому что другой запрос раньше приводил к ошибке, но после этого каким-то образом был назначен журнал.
Я действительно ничего особенного не делаю, я использую Ktor в качестве моего сервлета и у меня есть перехватчик, который создает протоколировать, когда возникает исключение, прежде чем возвращать статус 500.
Я использую Java вход через SLF4J с помощью обработчика ведения журнала в облаке Google, но до этого я использовал возврат через SLf4J, и у меня возникла та же проблема.
Содержание из самого логов тоже правильно, возвращен статус запроса, уровень записи в журнале, сообщение, все ок.
Я подумал, что это может быть потому, что я использую kotlin и переключаю контексты сопрограмм во время одного запроса, но в некоторых случаях точка, где я записываю журнал, и куда я отправляю ответ, находятся точно рядом друг с другом. , поэтому я не уверен, имеет ли kotlin какое-либо отношение к этому.
Мои logging.properties:
# To use this configuration, add to system properties : -Djava.util.logging.config.file="/path/to/file"
#
.level = INFO
# it is recommended that io.grpc and sun.net logging level is kept at INFO level,
# as both these packages are used by Stackdriver internals and can result in verbose / initialization problems.
io.grpc.netty.level=INFO
sun.net.level=INFO
handlers=com.google.cloud.logging.LoggingHandler
# default : java.log
com.google.cloud.logging.LoggingHandler.log=custom_log
# default : INFO
com.google.cloud.logging.LoggingHandler.level=INFO
# default : ERROR
com.google.cloud.logging.LoggingHandler.flushLevel=WARNING
# default : auto-detected, fallback "global"
#com.google.cloud.logging.LoggingHandler.resourceType=container
# custom formatter
com.google.cloud.logging.LoggingHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$-6s %2$s %5$s%6$s%n
#optional enhancers (to add additional fields, labels)
#com.google.cloud.logging.LoggingHandler.enhancers=com.example.logging.jul.enhancers.ExampleEnhancer
Мои относящиеся к журналу зависимости:
implementation "org.slf4j:slf4j-jdk14:1.7.30"
implementation "com.google.cloud:google-cloud-logging:1.100.0"
Пример регистрации звонка:
exception<Throwable> { e ->
logger().error("Error", e)
call.respondText(e.message ?: "", ContentType.Text.Plain, HttpStatusCode.InternalServerError)
}
с logger()
:
import org.slf4j.Logger
import org.slf4j.LoggerFactory
inline fun <reified T : Any> T.logger(): Logger = LoggerFactory.getLogger(T::class.java)
Редактировать:
Пример журнала в облаке Google. Первый запрос имеет параметр запроса GAID=cdda802e-fb9c-47ad-0794d394c913
, но, как вы можете видеть, журнал ошибок для этого запроса приведен ниже, отмечен красным.