如何将Java GC日志定向到Java Logger?

问题描述 投票:0回答:1

我有一个在 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 日志消息采取与应用程序内部日志记录相同的路线?

java logging garbage-collection
1个回答
0
投票

如何让 GC 日志消息采取与应用程序内部日志记录相同的路线?

据我所知你不能。 不支持。

GC 日志记录作为 GC 子系统的一部分在本机代码中实现。 它将使用本机缓冲区在 C / C++ 代码中创建日志消息并将它们写入本机文件描述符。

要让 GC 日志记录使用应用程序的日志记录框架(

java.util.logging
或第 3 方日志记录外观或框架),日志事件需要转换为 Java 对象;即表示事件、格式字符串、记录值等的对象。 这是一个大问题,因为许多 GC 日志事件发生在所有 Java 代码都处于安全点的位置,并且不可能分配和创建任何 Java 对象。

我想可以通过(例如)缓冲 GC 日志记录事件来处理这个问题,而 Java 对象创建是不可能的,但还有更多。 一旦创建了 Java 对象,它们就需要由 (Java) 日志框架进行处理。 但是,只有在 GC 允许正常的 Java 代码再次运行之前,这种情况才会发生。

总结:

  • 不支持。
  • 实施起来会很复杂。
  • GC 日志消息只会在 GC 允许正常 Java 代码恢复之后出现在应用程序日志中。
© www.soinside.com 2019 - 2024. All rights reserved.