我的基于 logback java(无 xml)的配置被忽略

Ste*_*ane 7 java spring logback

尝试配置 logback,但在运行应用程序时无法使用我的配置。

有很多控制台输出,即使我删除了所有配置,并且没有文件输出,所以我认为控制台输出是使用一些默认配置完成的。

到目前为止,这是我的配置:

@Configuration
public class Log4j {

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

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

    @Bean (initMethod = "start", destroyMethod = "stop")
    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 consoleAppender (LoggerContext context, PatternLayoutEncoder encoder) {
        ConsoleAppender consoleAppender = new ConsoleAppender();
        consoleAppender.setContext(context);
        consoleAppender.setEncoder(encoder);
        return consoleAppender;
    }

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

    @Bean (initMethod = "start", destroyMethod = "stop")
    public static SMTPAppender mailAppender(LoggerContext context) {
        SMTPAppender mailAppender = new SMTPAppender();
        mailAppender.setContext(context);
        mailAppender.setName("GmailAppender");
        mailAppender.setSMTPHost("smtp.gmail.com");
        mailAppender.setSMTPPort(465); // 587
        mailAppender.setSTARTTLS(true);
        mailAppender.setUsername("xxxxxx@gmail.com");
        mailAppender.setPassword("xxxxxx");
        mailAppender.setFrom("xxxxxx@gmail.com");
        mailAppender.addTo("xxxxxx@gmail.com");
        mailAppender.setSubject("[LOG] Java - learnintouch");
        PatternLayout patternLayout = new PatternLayout();
        patternLayout.setPattern(PATTERN);
        mailAppender.setLayout(patternLayout);
        LevelFilter levelRangeFilter = new LevelFilter();
        levelRangeFilter.setLevel(Level.ERROR);
        mailAppender.addFilter(levelRangeFilter);
        return mailAppender;
    }

    @Bean
    public static Logger registerSpringLogger(ConsoleAppender consoleAppender) {
        Logger logger = new Logger(...
        logger.setLevel(Level.DEBUG);
        logger.addAppender(consoleAppender);
        return logger;
    }
Run Code Online (Sandbox Code Playgroud)

即使我将所有寄存器 bean 设置为 OFF 级别,控制台中仍然有很多输出。

如何让我的上述配置不被忽略?

更新:实际上,配置并没有被忽略,它只是淹没在大量控制台输出中。减少此控制台输出的一种方法是在src/main/resources包含以下内容的目录中添加 logback.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>

<!-- This empty file is one way to prevent logback from logging like crazy -->
<configuration />
Run Code Online (Sandbox Code Playgroud)

然后,以下配置允许我只输出我的应用程序记录器和 sql 语句:

  @Bean
  public static Logger registerThalasoftLogger(LoggerContext loggerContext,
      ConsoleAppender consoleAppender, FileAppender fileAppender) throws IOException {
    Logger logger = loggerContext.getLogger("com.nsn.nitro.project.data");
    logger.setLevel(Level.DEBUG); // Display the application loggers
    logger.addAppender(consoleAppender);
    logger.addAppender(fileAppender);
    return logger;
  }

  @Bean
  public static Logger registerSpringLogger(LoggerContext loggerContext,
      ConsoleAppender consoleAppender) {
    Logger logger = loggerContext.getLogger("org.springframework");
    logger.setLevel(Level.OFF);
    logger.addAppender(consoleAppender);
    return logger;
  }

  @Bean
  public static Logger registerJdbcSqlOnlyLogger(LoggerContext loggerContext,
      ConsoleAppender consoleAppender, FileAppender fileAppender) throws IOException {
    Logger logger = loggerContext.getLogger("jdbc.sqlonly");
    logger.setLevel(Level.DEBUG); // Display the sql statements with their parameters values
    logger.addAppender(consoleAppender);
    logger.addAppender(fileAppender);
    return logger;
  }

  @Bean
  public static Logger registerHibernateTypeLogger(LoggerContext loggerContext,
      ConsoleAppender consoleAppender) {
    Logger logger = loggerContext.getLogger("org.hibernate.type");
    logger.setLevel(Level.OFF);
    logger.addAppender(consoleAppender);
    return logger;
  }

  @Bean
  public static Logger registerHibernateSqlLogger(LoggerContext loggerContext,
      ConsoleAppender consoleAppender) {
    Logger logger = loggerContext.getLogger("org.hibernate.SQL");
    logger.setLevel(Level.OFF);
    logger.addAppender(consoleAppender);
    return logger;
  }

  @Bean
  public static Logger registerLog4JdbcLogger(LoggerContext loggerContext,
      ConsoleAppender consoleAppender) throws IOException {
    Logger logger = loggerContext.getLogger("log4jdbc.debug");
    logger.setLevel(Level.OFF);
    logger.addAppender(consoleAppender);
    return logger;
  }
Run Code Online (Sandbox Code Playgroud)

请注意,我将此更新视为一种解决方法而不是解决方案,因为它使用了 logback.xml 文件。我最初的问题是关于 XML 自由配置。

car*_*ing 1

我们需要实现类似的东西,以便能够重新配置应用程序的日志记录,因此我们决定将其开源(在 Apache 2.0 许可证下)并将其放在 Github 上。请查看logback-configuration项目。

如果您发现它有用,请告诉我(或者给我发电子邮件,您可以在项目的 上找到我的电子邮件pom.xml,或者在此处回复),我将发布一个版本并将其推送到 Maven Central。

该项目很小,但非常简单。您可以查看一些测试,以更好地了解如何做事。