You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

App Engine Java 11标准环境使用logging.properties配置日志的问题

问题背景

我正在App Engine Java 11标准环境的Jetty Web服务应用中尝试通过logging.properties文件修改日志配置,最初的app.yaml入口点配置如下:

runtime: java11
entrypoint: 'java -cp "*" com.jettymain.Main webapp.war'

根据官方文档说明,使用logging.properties需要将配置文件路径作为系统参数传入应用:-Djava.util.logging.config.file=/path/to/logging.properties

我首先在启动Jetty嵌入式服务的com.jettymain.Main类最开头添加了系统属性设置:

System.setProperty("java.util.logging.config.file", "WEB-INF/logging.properties")

但该方式未生效。修改app.yaml入口点后,Web服务器可以加载日志配置,但无法加载Google Cloud Logging的handler类com.google.cloud.logging.LoggingHandler,该类用于将日志写入Google Stackdriver。我已经在应用和Web服务器中都引入了Google Cloud Logging依赖,但问题仍然存在,依赖配置如下:

<dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>google-cloud-logging</artifactId>
  <version>3.0.1</version>
</dependency>

修改后的app.yaml入口点配置如下:

runtime: java11
entrypoint: 'java -cp "*" com.jettymain.Main webapp.war -Djava.util.logging.config.file=WEB-INF/logging.properties'

我使用的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 Cloud 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=FINE

# default : ERROR
com.google.cloud.logging.LoggingHandler.flushLevel=EMERGENCY

# 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=%3$s: %5$s%6$s

# Level for all logs coming from GWT client (can't filter by specific classes on client)
com.google.gwt.logging.server.RemoteLoggingServiceUtil.level = WARNING
com.beoui.geocell.level=WARNING
解决方案

1. 修正JVM参数顺序

你将-D开头的JVM系统参数放在了主类名和war包参数之后,JVM会将其识别为应用程序的入参而非JVM启动参数,不会生效。所有JVM参数必须放在java命令之后、主类名之前的位置。

2. 修正配置文件路径

App Engine Java 11环境的应用部署根目录为/workspace,如果logging.properties存放在war包的WEB-INF目录下,直接写相对路径可能无法被JVM正确识别,需要填写完整绝对路径。

3. 可选:Main类内设置配置后的重载操作

如果选择在Main类中设置系统属性,需要在初始化任意日志类之前执行设置,并且手动触发日志配置重载,代码如下:

System.setProperty("java.util.logging.config.file", "WEB-INF/logging.properties");
LogManager.getLogManager().readConfiguration();

4. 排查类加载问题

确认google-cloud-logging依赖的scope没有被设置为provided,必须保留为默认的compile scope,确保依赖会被打包到最终部署包中。如果需要排查类加载情况,可以在JVM参数中添加-verbose:class,查看com.google.cloud.logging.LoggingHandler是否被正确加载。

正确的app.yaml入口点配置

runtime: java11
entrypoint: 'java -Djava.util.logging.config.file=/workspace/WEB-INF/logging.properties -cp "*" com.jettymain.Main webapp.war'

内容的提问来源于stack exchange,提问作者montss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:15:03