java - 如何在使用 Java 注释配置并使用 log4j.properties 文件的 Spring Mvc 应用程序中配置 log4j

标签 java spring spring-mvc logging log4j

我正在使用 Spring MVC 4.2.5.RELEASE 开发 Maven Web 应用程序,我正在使用 Netbeans IDE 和 GlassFishSErver 4.1,我想使用 log4j 1.2.17 所以我创建了一个 log4j.properties 文件,但似乎我的属性文件没有被发现,因为我收到以下错误:

log4j:WARN No appenders could be found for logger (org.springframework.web.servlet.DispatcherServlet).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

我使用 java 注释配置了 Spring 应用程序,这是我的配置

@Configuration
@EnableWebMvc
@ComponentScan({"config", "controllers"})
public class ConfigMVC extends WebMvcConfigurerAdapter {

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations("/WEB-INF/resources/");
}

@Bean
public UrlBasedViewResolver setupViewResolver() {
    UrlBasedViewResolver resolver = new UrlBasedViewResolver();
    resolver.setPrefix("/WEB-INF/jsp/");
    resolver.setSuffix(".jsp");
    resolver.setViewClass(JstlView.class);
    return resolver;
}

}

这是我的 WebInitializer

public class WebInicializar implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(ConfigMVC.class);
        ctx.setServletContext(servletContext);
        Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
        servlet.addMapping("/");
        servlet.setLoadOnStartup(1);
        servlet.setInitParameter("throwExceptionIfNoHandlerFound", "true");
    }
}

这是我的 Controller

@Controller
public class HomeController {

    private static final Logger logger = Logger.getLogger(HomeController.class);

    @RequestMapping(value = "/myPage", method = RequestMethod.GET)
    public String paginaSinMap(ModelMap map) {

    logger.info("This is an info log entry");
    logger.error("This is an error log entry");

    return "myPage";
}

这是我的log4j.properties

# LOG4J configuration
log4j.rootLogger=INFO, Appender1, Appender2

log4j.appender.Appender1=org.apache.log4j.ConsoleAppender
log4j.appender.Appender1.layout=org.apache.log4j.PatternLayout
log4j.appender.Appender1.layout.ConversionPattern=%-7p %d [%t] %c %x - %m%n

log4j.appender.Appender2=org.apache.log4j.FileAppender
log4j.appender.Appender2.File=D:/Logs/SpringMVC.log
log4j.appender.Appender2.layout=org.apache.log4j.PatternLayout
log4j.appender.Appender2.layout.ConversionPattern=%-7p %d [%t] %c %x - %m%n

我把这个 log4j.properties 放在我的资源文件夹中,这是我的项目结构

编辑:我没有提到我的项目是一个使用 spring 的 Maven Web 应用程序 这是我的项目结构

MyWebAppProjectName
--Web Pages
  --WEB-INF
    --jsp
         index.jsp
    --resources
      --js
         js.js
      --css
         site.css
      log4j.properties
--Source Packages
  --config
      ConfigMVC.java
      WebInitializaer.java
  --controllers
      HomeController.java
--Test Packages
--Other Resources
  --src/main/resources
    --default package
--Dependencies
--Java Dependencies
--Project FIles

因此,我将 log4j.properties 放在 Other Resources/src/main/resources 中,当我执行此操作时,Netbeans 创建了一个 default Package,其中包含像 default package/log4j-properties 这样的文件,并且日志开始出现在输出中,一切都按预期正常工作。

我尝试在此路径 src/main/resources 中创建一个名为 Log4jResource 的包,但当我执行此操作时,它停止工作并再次显示错误,因此有一种方法可以将此文件放入该文件夹中,但不必使用当我将文件夹放入其中时 NetBeans 创建的默认包

我尝试重构重命名默认包,但它向我显示此错误Module JPA Refactoring 引发了 java.lang.NullPointerException。请报告针对 JPA 重构模块的错误并附上您的 var/log/messages.log。

我的最终项目结构如下所示

MyWebAppProjectName
--Web Pages
  --WEB-INF
    --jsp
         index.jsp
    --resources
      --js
         js.js
      --css
         site.css
      log4j.properties
--Source Packages
  --config
      ConfigMVC.java
      WebInitializaer.java
  --controllers
      HomeController.java
--Test Packages
--Other Resources
  --src/main/resources
    --default package
      --log4j.properties
--Dependencies
--Java Dependencies
--Project FIles

最佳答案

尝试将 log4j.properties 文件移动到 ./WEB-INF/。您的 Spring 资源处理程序当然可以查看 ./WEB-INF/resources/。我不相信log4j对spring一无所知,log4j也不关心spring。 Log4j 将在类路径中查找属性文件,除非您明确告诉 log4j 在其他地方查找。

我想现在,你只是告诉 spring 去哪里寻找东西。

关于java - 如何在使用 Java 注释配置并使用 log4j.properties 文件的 Spring Mvc 应用程序中配置 log4j,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36143287/

相关文章:

java - Play Framework 中的安全模块使用

java - 安卓 |货币转换器实时汇率

java - 没有 setter 的 JPA 2.0 持久属性

java - 如何将计划任务与还使用 keycloak 提供网页的客户端一起使用?

spring - InvalidDataAccessApiUsageException : Executing an update/delete query Spring XML to Java config

java - spring mvc 中的每个请求是否都创建了一个新的 bean 对象?

java - 使用 spring Rest api

spring - 使用自定义 DateFormatter 配置转换服务

java - spring中如何同时使用CustomDateEditor和DateTimeFormat?

java - 使用 Spring MVC 绑定(bind)表单对象 CGLIB 的动态表单