Java DropWizard的自定义logback附加程序出现问题

Java DropWizard的自定义logback附加程序出现问题,java,jackson,logback,slf4j,dropwizard,Java,Jackson,Logback,Slf4j,Dropwizard,我正在尝试添加一个自定义的LogAppender,以便在drop向导中使用。据我所知,您添加了一个appender: import ch.qos.logback.classic.Level; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.core.Appender; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterx

我正在尝试添加一个自定义的LogAppender,以便在drop向导中使用。据我所知,您添加了一个appender:

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.Appender;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.google.cloud.logging.logback.LoggingAppender;
import io.dropwizard.logging.AbstractAppenderFactory;
import io.dropwizard.logging.async.AsyncAppenderFactory;
import io.dropwizard.logging.filter.LevelFilterFactory;
import io.dropwizard.logging.layout.LayoutFactory;

@JsonTypeName("stack-driver-console")
public class StackDriverAppenderFactory extends AbstractAppenderFactory {

  private String appenderName = "CLOUD";
  private boolean includeContextName = true;

  @JsonProperty
  public String getName() {
    return this.appenderName;
  }

  @JsonProperty
  public void setName(String name) {
    this.appenderName = name;
  }

  @Override
  public Appender build(
    LoggerContext loggerContext,
    String s,
    LayoutFactory layoutFactory,
    LevelFilterFactory levelFilterFactory,
    AsyncAppenderFactory asyncAppenderFactory) {

    setNeverBlock(true);
    setTimeZone("utc");
    setLogFormat("%-6level [%d{HH:mm:ss.SSS}] [%t] %logger{5} - %X{code} %msg %n");

    LoggingAppender cloudAppender = new LoggingAppender();
    cloudAppender.addEnhancer("com.google.cloud.logging.TraceLoggingEnhancer");
    cloudAppender.addFilter(levelFilterFactory.build(Level.toLevel(getThreshold())));

    cloudAppender.setFlushLevel(Level.WARN);
    cloudAppender.setLog("application.log");

    cloudAppender.setName(appenderName);
    cloudAppender.setContext(loggerContext);
    cloudAppender.start();

    return wrapAsync(cloudAppender, asyncAppenderFactory);
  }
}

然后在/main/resources/META-INF/services/io.dropwizard.logging.AppenderFactory中

io.dropwizard.logging.ConsoleAppenderFactory
io.dropwizard.logging.FileAppenderFactory
io.dropwizard.logging.SyslogAppenderFactory
com.example.logger.StackDriverAppenderFactory
Dropwizard版本:编译“io.Dropwizard:Dropwizard核心:1.3.16”

config.yaml

# Logging settings.
logging:
  level: DEBUG
  appenders:
    - type: stack-driver-console
      threshold: INFO

# use the simple server factory if you only want to run on a single port
server:
  applicationConnectors:
    - type: http
      port: 8080
  adminConnectors:
    - type: http
      port: 8081

# the only required property is resourcePackage, for more config options see below
swagger:
  resourcePackage: com.example.resources
当我在io.dropwizard.configuration.BasicConfiguration工厂:build()行127中放置断点时

  final T config = mapper.readValue(new TreeTraversingParser(node), klass);      
其中,节点定义为:

{ 
   "logging":{ 
      "level":"DEBUG",
      "appenders":[ 
         { 
            "type":"stack-driver-console",
            "threshold":"INFO"
         }
      ]
   },
   "server":{ 
      "applicationConnectors":[ 
         { 
            "type":"http",
            "port":8080
         }
      ],
      "adminConnectors":[ 
         { 
            "type":"http",
            "port":8081
         }
      ]
   },
   "swagger":{ 
      "resourcePackage":"com.example.resources"
   }
}
抛出异常

com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id 'stack-driver-console' as a subtype of [simple type, class io.dropwizard.logging.AppenderFactory<ch.qos.logback.classic.spi.ILoggingEvent>]: known type ids = [console, file, syslog, tcp, udp] (for POJO property 'appenders')
 at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: com.example.App["logging"]->io.dropwizard.logging.DefaultLoggingFactory["appenders"]->java.util.ArrayList[0])
com.fasterxml.jackson.databind.exc.invalidTypeIdeException:无法将类型id“stack driver console”解析为[simple type,class io.dropwizard.logging.AppenderFactory]:已知类型id=[console,file,syslog,tcp,udp](用于POJO属性“appenders”)
在[来源:未知;第-1行,第-1列](通过引用链:com.example.App[“logging”]->io.dropwizard.logging.DefaultLoggingFactory[“appenders”]->java.util.ArrayList[0])
我不清楚为什么dropwizard很难识别自定义类型。这个习惯起作用了,有什么变化吗


我也遵循了这个示例“”

似乎接口中有变化。@zloster我认为一个是针对LogEvents的,另一个更通用?你说得对,我忽略了这一点。但是看看这里:我已经成功地创建了一个模拟控制台appender的虚拟appender。