Проблема с пользовательскими приложениями log4j для DropWizard - PullRequest
0 голосов
/ 11 ноября 2019

Я пытаюсь добавить собственный 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"

...