Java DropWizard的自定义logback附加程序出现问题
我正在尝试添加一个自定义的LogAppender,以便在drop向导中使用。据我所知,您添加了一个appender: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
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。