3

I got stuck with java based logback configuration via beans. As observed, the configuration is not even loading. Would be great if anybody can guide me to make it resolved. Attaching the code below.

public class JsonLogAppender{

@Bean("loggerContext")
public LoggerContext loggerContext() {
    return (LoggerContext) LoggerFactory.getILoggerFactory();
}

@Bean
@DependsOn("loggerContext")
public static Logger rootLogger(LoggerContext loggerContext) {
    Logger rootLogger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
    rootLogger.setLevel(Level.INFO);
    rootLogger.addAppender(consoleAppender(loggerContext, rootLogger));
    rootLogger.addAppender(tcpSocketAppender(loggerContext, rootLogger));
    return rootLogger;
}

@Bean
protected static ConsoleAppender<ILoggingEvent> consoleAppender(LoggerContext loggerContext, Logger rootLogger) {
    ConsoleAppender<ILoggingEvent> consoleAppender = new ConsoleAppender<>();
    consoleAppender.setContext(loggerContext);
    consoleAppender.setName(CONSOLE_APPENDER_NAME);
    consoleAppender.setEncoder(patternLayoutEncoder(loggerContext));
    consoleAppender.start();
    return consoleAppender;
}

@DependsOn("rootLogger")
public static PatternLayoutEncoder patternLayoutEncoder(LoggerContext loggerContext) {
    PatternLayoutEncoder encoder = new PatternLayoutEncoder();
    encoder.setContext(loggerContext);
    encoder.setPattern(PATTERN);
    encoder.setCharset(Charset.forName(CHARSET));
    encoder.start();
    return encoder;
}

@Bean
@Primary
protected static LogstashTcpSocketAppender tcpSocketAppender(LoggerContext loggerContext, Logger rootLogger) {
    LogstashTcpSocketAppender appender = new LogstashTcpSocketAppender();
    appender.setName(TCP_APPENDER_NAME);
    appender.setContext(loggerContext);
    appender.addDestination(TCP_DESTINATION);
    appender.setEncoder(compositeJsonEncoder(loggerContext, rootLogger));
    return appender;
}

@Bean
protected static LoggingEventCompositeJsonEncoder compositeJsonEncoder(LoggerContext loggerContext, Logger rootLogger){
    LoggingEventCompositeJsonEncoder encoder = new LoggingEventCompositeJsonEncoder();
    encoder.setContext(loggerContext);
    encoder.getProviders().addProvider(new MessageJsonProvider());
    encoder.getProviders().addProvider(new StackTraceJsonProvider());
    encoder.getProviders().addProvider(new LogstashMarkersJsonProvider());
    encoder.getProviders().addProvider(new ThreadNameJsonProvider());
    encoder.getProviders().addProvider(new LoggerNameJsonProvider());
    encoder.getProviders().addProvider(new LogLevelJsonProvider());
    encoder.getProviders().addProvider(new ContextJsonProvider<>());
    encoder.getProviders().addProvider(new MdcJsonProvider());
    encoder.getProviders().addProvider(withPattern(PATTERN, new LoggingEventPatternJsonProvider(), loggerContext));
    encoder.start();
    return encoder;

}

private static AbstractPatternJsonProvider<ILoggingEvent> withPattern(
        String pattern,
        AbstractPatternJsonProvider<ILoggingEvent> provider,
        LoggerContext context
        ) {

    provider.setContext(context);
    provider.setPattern(pattern);
    return provider;
}

}

I am looking for only java based configuration not the XML based(I have the solution with XML which is working fine).

Update Resolved the issue, I have missed adding @Configuration, its working now as expected.

Not deleteing the thread, as it may be helpul for people looking for java based configuration for the corresponding xml configuration.

SkPuthumana
  • 73
  • 1
  • 7

1 Answers1

1

@Configuration is missing, Indicates that a class declares one or more @Bean methods and may be processed by the Spring container to generate bean definitions and service requests for those beans at runtime.

SkPuthumana
  • 73
  • 1
  • 7