我有一个在 Google Cloud-Run 上运行的 Java 服务器,并通过
启用了垃圾收集日志记录 "-Xlog:gc",
"-Xlog:gc*=info,heap*=debug,safepoint=info",
"-XX:NativeMemoryTracking=summary",
"-XX:+UnlockDiagnosticVMOptions",
"-XX:+PrintNMTStatistics",
当服务器在本地或本地容器内运行时,我可以看到控制台上出现 GC 消息。 但是当我在 Google 的环境中运行它时,这些日志消息不会发送到日志服务器。
我的应用程序通过
slf4j
库进行日志记录,如下所示:
logger = LoggerFactory.getLogger("com.mydomain")
logger.info("foo!")
logback.xml
配置有这样的:
<appender name="cloud" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
</encoder>
<log>backend</log>
<flushLevel>WARN</flushLevel>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
如何让 GC 日志消息采取与应用程序内部日志记录相同的路线?
如何让 GC 日志消息采取与应用程序内部日志记录相同的路线?
据我所知你不能。 不支持。
GC 日志记录作为 GC 子系统的一部分在本机代码中实现。 它将使用本机缓冲区在 C / C++ 代码中创建日志消息并将它们写入本机文件描述符。
要让 GC 日志记录使用应用程序的日志记录框架(
java.util.logging
或第 3 方日志记录外观或框架),日志事件需要转换为 Java 对象;即表示事件、格式字符串、记录值等的对象。 这是一个大问题,因为许多 GC 日志事件发生在所有 Java 代码都处于安全点的位置,并且不可能分配和创建任何 Java 对象。
我想可以通过(例如)缓冲 GC 日志记录事件来处理这个问题,而 Java 对象创建是不可能的,但还有更多。 一旦创建了 Java 对象,它们就需要由 (Java) 日志框架进行处理。 但是,只有在 GC 允许正常的 Java 代码再次运行之前,这种情况才会发生。
总结: