使用log4j2日志框架在Controller类中打印日志,需要打印日志的方法测试能正常运行,但控制台和日志文件都没有输出日志信息



@Configuration
public class Log4j2Config {
    @Bean
    public Logger logger() {
        Resource resource = new ClassPathResource("log4j2.properties");
        String configFileName = (resource.getFilename() == null) ? "log4j2.properties" : resource.getFilename();
        System.setProperty("log4j.configurationFile", configFileName);
        return LogManager.getLogger(Log4j2Config.class);
    }
}


public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    protected Class[] getRootConfigClasses() {
        return new Class[0];
    }

    protected Class[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    protected String[] getServletMappings() {
        return new String[]{"/"};//拦截所有静态资源
    }

    //乱码处理
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};
    }

    @PostConstruct
    public void initLog4j2() {
        logger.debug("Initializing Log4j2");
        // 执行log4j2的初始化操作
    }
}


@Configuration
@ComponentScan("com.***")
@EnableWebMvc
public class SpringMvcConfig {
}


@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //当访问/pages/????时候,从/pages目录下查找内容
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
        registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
    }
}

//Controller类 打印日志
@Log4j2
@RestController
@RequestMapping("/books")
public class BookController {

    private static final Logger logger = LogManager.getLogger(BookController.class);
    //Logger对象的实例化通过注解来实现,所以此处可以直接调用日志方法
    public BookController() {
        logger.debug("Creating a new instance of BookController");
    }

    @PostMapping
    public String save(@RequestBody Book book){
        System.out.println("book save success");
        logger.info("book save ==> "+ book);
        log.debug("book save ==> " + book); // 添加一条额外的日志输出语句
        return "{'module':'book save success'}";
    }

    @GetMapping
    public List getAll(){
        List bookList = new ArrayList();

        Book book1 = new Book();
        book1.setType("计算机");
        book1.setName("SpringMVC入门教程");
        book1.setDescription("小试牛刀");
        bookList.add(book1);

        Book book2 = new Book();
        book2.setType("计算机");
        book2.setName("SpringMVC实战教程");
        book2.setDescription("一代宗师");
        bookList.add(book2);

        Book book3 = new Book();
        book3.setType("计算机丛书");
        book3.setName("SpringMVC实战教程进阶");
        book3.setDescription("一代宗师呕心创作");
        bookList.add(book3);

        System.out.println("book getAll is running ...");
        logger.info("book getAll is running ...");
        log.debug("book getAll is running ..."); // 添加一条额外的日志输出语句

        return bookList;
    }
}

//log4j2.properties
# 日志级别
log4j2.rootLogger.level = info

# 打印到控制台
log4j2.appender.console.type = Console
log4j2.appender.console.name = Console
log4j2.appender.console.layout.type = PatternLayout
log4j2.appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
log4j2.appender.console.level = info

# 打印到log文件
log4j2.appender.file.type = File
log4j2.appender.file.name = File
log4j2.appender.file.fileName = ./logs/mylog.log
log4j2.appender.file.layout.type = PatternLayout
log4j2.appender.file.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
log4j2.appender.file.level = info

# 将日志输出到控制台和文件
log4j2.logger.com.mycompany = info, console, file

//pom.xml 依赖关系



  4.0.0

  com.***
  springmvc_07_rest_case
  1.0-SNAPSHOT
  war

  
    
      javax.servlet
      javax.servlet-api
      3.1.0
      provided
    
    
      org.springframework
      spring-webmvc
      5.2.10.RELEASE
    
    
      com.fasterxml.jackson.core
      jackson-databind
      2.9.0
    
    
      org.apache.logging.log4j
      log4j-core
      2.17.1
    
    
      org.apache.logging.log4j
      log4j-api
      2.17.1
    
    
      org.apache.logging.log4j
      log4j-web
      2.17.1
    
    
      org.projectlombok
      lombok
      RELEASE
      compile
    
  
  
    
      
        org.apache.maven.plugins
        maven-resources-plugin
        3.2.0
        
          
            default-copy-resources
            process-resources
            
              copy-resources
            
            
              ${project.build.directory}/my-resources
              
                
                  src/main/my-resources
                  true
                
              
            
          
        
      
      
        org.apache.maven.plugins
        maven-compiler-plugin
        3.8.1
        
          6
          6
        
      
    
  

该回答引用GPTᴼᴾᴱᴺᴬᴵ
在控制台和日志文件都没有输出日志信息的情况下,可以按照以下步骤来检查并解决问题:

  1. 检查日志配置文件的路径和内容是否正确,如是否在classpath下,名称是否正确,内容是否符合语法规范。在本例中,可以尝试输出配置文件的路径,确保能够找到文件,并检查文件内容是否符合预期。
  2. 检查日志级别是否设置正确,以确保日志信息能够被输出。在本例中,可以尝试将日志级别调整为 DEBUG,以便更详细地查看日志信息。
  3. 确保在打印日志的方法中使用的日志对象是正确的。在本例中,可以检查 BookController 类是否正确注入了 Logger 对象,并确保在打印日志时使用的是正确的 Logger 对象。
  4. 尝试使用不同的日志输出方式,如 Console 和 File,以确定问题是否与某个特定的输出方式有关。在本例中,可以将日志输出到 Console 或者同时输出到 Console 和 File,以便进行比较。
  5. 检查是否存在其他与日志框架相关的配置,如 Spring Boot 自带的日志框架配置等。如果存在多个日志框架的配置,可能会导致冲突或不一致的行为。可以尝试禁用其他日志框架或检查它们的配置是否与 log4j2 的配置相冲突。
  6. 尝试升级 log4j2 的版本,以解决可能存在的 bug 或兼容性问题。可以查看 log4j2 的官方文档或社区支持,了解是否存在已知的问题或建议的版本升级。
  7. 在调试时可以在代码中添加额外的日志输出语句,如在 initLog4j2 方法中输出日志配置的路径和名称,或在 BookController 的构造方法中输出日志对象的名称和是否为 null 等信息,以便更详细地了解代码的执行情况。