Search code examples
spring-bootlogbackspring-logback

No bean of PatternLayoutEncoder type can be found


I'm using LogBack in a Spring Boot 2 application and I'm trying to configure a console appender but it gives me the following error:

Description:

Parameter 1 of method consoleAppender in com.thalasoft.user.rest.config.LogWeb required a bean of type 'ch.qos.logback.classic.encoder.PatternLayoutEncoder' that could not be found.

Action:

Consider defining a bean of type 'ch.qos.logback.classic.encoder.PatternLayoutEncoder' in your configuration.

But I do have such a bean specified:

@Configuration
public class LogWeb {

    private final static String PATTERN = "%date %-5level [%thread] %logger{36} %m%n %rEx";

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

    @Bean
    public static PatternLayoutEncoder encoder (LoggerContext ctx) {
        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
        encoder.setContext(ctx);
        encoder.setPattern(PATTERN);
        return encoder;
    }

    @Bean (initMethod = "start", destroyMethod = "stop")
    public static ConsoleAppender<ILoggingEvent> consoleAppender (LoggerContext loggerContext, PatternLayoutEncoder encoder) {
        ConsoleAppender<ILoggingEvent> consoleAppender = new ConsoleAppender<ILoggingEvent>();
        consoleAppender.setContext(loggerContext);
        consoleAppender.setEncoder(encoder);
        return consoleAppender;
    }

    @Bean (initMethod = "start", destroyMethod = "stop")
    public static FileAppender<ILoggingEvent> fileAppender(LoggerContext loggerContext, PatternLayoutEncoder encoder) throws IOException {
        RollingFileAppender<ILoggingEvent> fileAppender = new RollingFileAppender<ILoggingEvent>();
        fileAppender.setContext(loggerContext);
        fileAppender.setEncoder(encoder);
        fileAppender.setFile("build.log");
        return fileAppender;
    }

    @Bean
    public Logger registerApplicationLogger(LoggerContext loggerContext, ConsoleAppender<ILoggingEvent> consoleAppender, FileAppender<ILoggingEvent> fileAppender) throws IOException {
        Logger logger = loggerContext.getLogger("com.thalasoft.user.rest");
        logger.setLevel(Level.DEBUG);
        logger.addAppender(consoleAppender);
        logger.addAppender(fileAppender);
        return logger;
    }

    @Bean
    public Logger registerSpringLogger(LoggerContext loggerContext, ConsoleAppender<ILoggingEvent> consoleAppender, FileAppender<ILoggingEvent> fileAppender) throws IOException {
        Logger logger = loggerContext.getLogger("org.springframework");
        logger.setLevel(Level.DEBUG);
        logger.addAppender(consoleAppender);
        logger.addAppender(fileAppender);
        return logger;
    }

}

I'm using Spring Boot 2.0.3.


Solution

  • The method named was the issue. After renaming the method to patternLayoutEncoder as in public PatternLayoutEncoder patternLayoutEncoder(LoggerContext ctx) { the bean was discovered and loaded all right.