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

