[英]App Engine Cloud Endpoints Frameworks (Java) - NullPointerException when run locally
[英]NullPointerException when using Logback appender for Cloud Logging with standard App Engine Java 11
我已按照本指南使用 logback appender 将我的应用程序日志写入 Cloud Logging。 我的应用程序是一个 Jetty 网络服务器,我通过将以下入口点添加到我的 app.yaml 文件来运行它:
runtime: java11
entrypoint: 'java -cp "*" com.jettymain.Main webapp.war'
这是在 pom 文件中添加的依赖项。
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-logging-logback</artifactId>
<version>0.122.1-alpha</version>
</dependency>
这是位于 src\\main\\resources 中的 logback.xml 文件:
<!-- [START logging_logback_config] -->
<configuration>
<appender name="CLOUD" class="com.google.cloud.logging.logback.LoggingAppender">
<log>application.log</log> <!-- Optional : default java.log -->
<resourceType>gae_app</resourceType> <!-- Optional : default: auto-detected, fallback: global -->
<flushLevel>WARN</flushLevel> <!-- Optional : default ERROR -->
</appender>
<root level="info">
<appender-ref ref="CLOUD" />
</root>
</configuration>
<!-- [END logging_logback_config] -->
这就是我使用记录器的方式:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Quickstart {
private static final Logger logger = LoggerFactory.getLogger(Quickstart.class);
public static void main(String[] args) {
logger.info("Logging INFO with Logback");
logger.error("Logging ERROR with Logback");
}
}
当我运行应用程序时,这是我得到的异常:
ERROR in ch.qos.logback.core.joran.spi.Interpreter@23:14 - RuntimeException in Action for tag [appender] com.google.cloud.logging.LoggingException: java.lang.NullPointerException
at com.google.cloud.logging.LoggingException: java.lang.NullPointerException
at at com.google.cloud.logging.LoggingOptions$DefaultLoggingRpcFactory.create(LoggingOptions.java:63)
at at com.google.cloud.logging.LoggingOptions$DefaultLoggingRpcFactory.create(LoggingOptions.java:55)
at at com.google.cloud.ServiceOptions.getRpc(ServiceOptions.java:560)
at at com.google.cloud.logging.LoggingOptions.getLoggingRpcV2(LoggingOptions.java:129)
at at com.google.cloud.logging.LoggingImpl.<init>(LoggingImpl.java:122)
at at com.google.cloud.logging.LoggingOptions$DefaultLoggingFactory.create(LoggingOptions.java:46)
at at com.google.cloud.logging.LoggingOptions$DefaultLoggingFactory.create(LoggingOptions.java:41)
at at com.google.cloud.ServiceOptions.getService(ServiceOptions.java:540)
at at com.google.cloud.logging.logback.LoggingAppender.getLogging(LoggingAppender.java:275)
at at com.google.cloud.logging.logback.LoggingAppender.start(LoggingAppender.java:236)
at at ch.qos.logback.core.joran.action.AppenderAction.end(AppenderAction.java:90)
at at ch.qos.logback.core.joran.spi.Interpreter.callEndAction(Interpreter.java:309)
at at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:193)
at at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:179)
at at ch.qos.logback.core.joran.spi.EventPlayer.play(EventPlayer.java:62)
at at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:165)
at at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:152)
at at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:110)
at at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:53)
at at ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:75)
at at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:150)
at at org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:84)
at at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:55)
at at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
at at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
at at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:417)
at at io.grpc.netty.shaded.io.netty.util.internal.logging.Slf4JLoggerFactory.<init>(Slf4JLoggerFactory.java:42)
at at io.grpc.netty.shaded.io.netty.util.internal.logging.InternalLoggerFactory.newDefaultFactory(InternalLoggerFactory.java:44)
at at io.grpc.netty.shaded.io.netty.util.internal.logging.InternalLoggerFactory.getDefaultFactory(InternalLoggerFactory.java:69)
at at io.grpc.netty.shaded.io.netty.util.internal.logging.InternalLoggerFactory.getInstance(InternalLoggerFactory.java:92)
at at io.grpc.netty.shaded.io.netty.util.internal.logging.InternalLoggerFactory.getInstance(InternalLoggerFactory.java:85)
at at io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent.<clinit>(PlatformDependent.java:80)
at at io.grpc.netty.shaded.io.netty.util.AsciiString.<init>(AsciiString.java:223)
at at io.grpc.netty.shaded.io.netty.util.AsciiString.<init>(AsciiString.java:210)
at at io.grpc.netty.shaded.io.netty.util.AsciiString.cached(AsciiString.java:1401)
at at io.grpc.netty.shaded.io.netty.util.AsciiString.<clinit>(AsciiString.java:48)
at at io.grpc.netty.shaded.io.grpc.netty.Utils.<clinit>(Utils.java:74)
at at io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder.<clinit>(NettyChannelBuilder.java:82)
at at io.grpc.netty.shaded.io.grpc.netty.NettyChannelProvider.builderForAddress(NettyChannelProvider.java:38)
at at io.grpc.netty.shaded.io.grpc.netty.NettyChannelProvider.builderForAddress(NettyChannelProvider.java:24)
at at io.grpc.ManagedChannelBuilder.forAddress(ManagedChannelBuilder.java:39)
at at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.createSingleChannel(InstantiatingGrpcChannelProvider.java:348)
at at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.access$1900(InstantiatingGrpcChannelProvider.java:82)
at at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider$1.createSingleChannel(InstantiatingGrpcChannelProvider.java:239)
at at com.google.api.gax.grpc.ChannelPool.create(ChannelPool.java:72)
at at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.createChannel(InstantiatingGrpcChannelProvider.java:249)
at at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.getTransportChannel(InstantiatingGrpcChannelProvider.java:227)
at at com.google.api.gax.rpc.ClientContext.create(ClientContext.java:205)
at at com.google.api.gax.rpc.ClientContext.create(ClientContext.java:136)
at at com.google.cloud.logging.spi.v2.GrpcLoggingRpc.<init>(GrpcLoggingRpc.java:148)
at at com.google.cloud.logging.LoggingOptions$DefaultLoggingRpcFactory.create(LoggingOptions.java:61)
at at com.google.cloud.logging.LoggingOptions$DefaultLoggingRpcFactory.create(LoggingOptions.java:55)
at at com.google.cloud.ServiceOptions.getRpc(ServiceOptions.java:560)
at at com.google.cloud.logging.LoggingOptions.getLoggingRpcV2(LoggingOptions.java:129)
at at com.google.cloud.logging.LoggingImpl.<init>(LoggingImpl.java:122)
at at com.google.cloud.logging.LoggingOptions$DefaultLoggingFactory.create(LoggingOptions.java:46)
at at com.google.cloud.logging.LoggingOptions$DefaultLoggingFactory.create(LoggingOptions.java:41)
at at com.google.cloud.ServiceOptions.getService(ServiceOptions.java:540)
at at com.google.cloud.logging.LoggingHandler.getLogging(LoggingHandler.java:361)
at at com.google.cloud.logging.LoggingHandler.<init>(LoggingHandler.java:195)
at at com.google.cloud.logging.LoggingHandler.<init>(LoggingHandler.java:151)
at at com.google.cloud.logging.LoggingHandler.<init>(LoggingHandler.java:120)
at at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
at at org.eclipse.jetty.server.handler.ContextHandler$StaticContext.createInstance(ContextHandler.java:2881)
at at org.eclipse.jetty.servlet.ServletContextHandler$Context.createInstance(ServletContextHandler.java:1299)
at at org.eclipse.jetty.server.handler.ContextHandler$StaticContext.createListener(ContextHandler.java:2892)
at at org.eclipse.jetty.servlet.ListenerHolder.doStart(ListenerHolder.java:94)
at at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
at at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:369)
at at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1449)
at at org.eclipse.jetty.maven.plugin.JettyWebAppContext.startWebapp(JettyWebAppContext.java:328)
at at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1414)
at at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:910)
at at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:288)
at at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:524)
at at org.eclipse.jetty.maven.plugin.JettyWebAppContext.doStart(JettyWebAppContext.java:397)
at at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
at at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169)
at at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:117)
at at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:97)
at at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
at at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169)
at at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:117)
at at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:97)
at at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
at at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169)
at at org.eclipse.jetty.server.Server.start(Server.java:423)
at at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:110)
at at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:97)
at at org.eclipse.jetty.server.Server.doStart(Server.java:387)
at at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
at at org.eclipse.jetty.maven.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:449)
at at org.eclipse.jetty.maven.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:310)
at at org.eclipse.jetty.maven.plugin.JettyRunWarExplodedMojo.execute(JettyRunWarExplodedMojo.java:59)
at at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
at at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
at at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
at at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
at at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
at at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
at at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
at at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
at at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
at at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
at at org.apache.maven.cli.MavenCli.execute(MavenCli.java:957)
at at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:289)
at at org.apache.maven.cli.MavenCli.main(MavenCli.java:193)
at at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
at at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
at at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
at at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)
Caused by: java.io.IOException: java.lang.NullPointerException
at at com.google.cloud.logging.spi.v2.GrpcLoggingRpc.<init>(GrpcLoggingRpc.java:187)
at at com.google.cloud.logging.LoggingOptions$DefaultLoggingRpcFactory.create(LoggingOptions.java:61)
at ... 120 common frames omitted
Caused by: java.lang.NullPointerException
at at io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder$NettyTransportFactory.<init>(NettyChannelBuilder.java:682)
at at io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder.buildTransportFactory(NettyChannelBuilder.java:530)
at at io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder$NettyChannelTransportFactoryBuilder.buildClientTransportFactory(NettyChannelBuilder.java:188)
at at io.grpc.internal.ManagedChannelImplBuilder.build(ManagedChannelImplBuilder.java:621)
at at io.grpc.internal.AbstractManagedChannelImplBuilder.build(AbstractManagedChannelImplBuilder.java:264)
at at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.createSingleChannel(InstantiatingGrpcChannelProvider.java:383)
at at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.access$1900(InstantiatingGrpcChannelProvider.java:82)
at at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider$1.createSingleChannel(InstantiatingGrpcChannelProvider.java:239)
at at com.google.api.gax.grpc.ChannelPool.create(ChannelPool.java:72)
at at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.createChannel(InstantiatingGrpcChannelProvider.java:249)
at at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.getTransportChannel(InstantiatingGrpcChannelProvider.java:227)
at at com.google.api.gax.rpc.ClientContext.create(ClientContext.java:205)
at at com.google.api.gax.rpc.ClientContext.create(ClientContext.java:136)
at at com.google.cloud.logging.spi.v2.GrpcLoggingRpc.<init>(GrpcLoggingRpc.java:148)
解决这个问题最简单的方法是构建一个简单的hello world应用程序,并尝试在请求日志下实现分组。
请参阅链接以实现此目的。
以下是如何在请求日志下对日志进行分组的解决方法:
在主文件SpringbootApplication.java 中:
有以下方法:
@GetMapping("/")
public String hello(@RequestHeader(value = "x-cloud-trace-context") String traceId) {
String[] parts = traceId.split("/");
String trace = parts[0];
MDC.put("logging.googleapis.trace", String.format("projects/%s/traces/%s", "YOUR_PROJECT_ID", trace));
logger.info("Logging INFO with Logback" + trace);
logger.error("Logging ERROR with Logback" + trace);
return trace;
}
我通过使用 spring mvc 注释并在 MDC 中设置跟踪的第一部分来获取 x-cloud-trace-context 标头。 您可以保留此方法或使用 http 请求过滤器将这部分抽象出来,而不是在每个方法中都这样做。 还要确保将“YOUR_PROJECT_ID”替换为您的实际项目 ID。
MDC 属性然后由 logback.xml 文件中定义的 TraceLoggingEventEnhancer 获取,然后确保所有日志都显示在您的请求日志下。
注意:Google 已提供了此处提到的修复程序。 确保您使用的是最新版本的 google-cloud-core。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.