Я пытаюсь добавить собственный LogAppender для использования в мастере выпадения. Насколько я понимаю, вы добавляете 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: compile 'io.dropwizard: dropwizard-core: 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.BasicConfigurationFactory: 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])
Мне не понятно, почему dropwizard имееттрудно определить пользовательский тип. Это использование для работы, что-то изменилось?
Я тоже следовал этому примеру "https://gist.github.com/ajmath/e9f90c29cd224653c218"