簡體   English   中英

將 Logback appender 與標准 App Engine Java 11 一起用於 Cloud Logging 時出現 NullPointerException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM