![](/img/trans.png)
[英]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.