log4j 信息级别和调试不起作用

Posted

技术标签:

【中文标题】log4j 信息级别和调试不起作用【英文标题】:log4j info level & debug not working 【发布时间】:2014-02-25 18:38:56 【问题描述】:

我在 Spring 应用程序中使用 log4j。 bean 创建和其他信息在控制台中正确显示并写入磁盘,但在处理程序方法中 log.info & log.debug 不工作。我在控制台中看不到任何输出。谁能告诉我为什么?

log4j.properties

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C:\\logging.log
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%dABSOLUTE %5p %c1:%L - %m%n

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%dyyyy-MM-dd HH:mm:ss.SSSS %p %t %c \u2013 %m%n

# Root logger option
log4j.rootLogger=debug, file, stdout

ClinicController.java

package com.petclinic.controller;


//ClinicController is the generic controller for the web app
@Controller
public class ClinicController 

    @Autowired
    private ClinicService clinicService;

    private static Logger logger = LogManager.getLogger("ClinicController");


    //Custom Handler for the welcome Page
    @RequestMapping("/welcome")
    public String welcomeHandler(HttpServletRequest request)
    
        logger.info(request.getServletPath());
        System.out.println("Inside Welcome Controller");
        System.out.println(request.getServletPath());
        logger.debug("Inside Clinic Controller Welcome Controller");
        return "welcome";
    

我可以在控制台中看到 System.out 语句,但看不到 logger.info 和调试。

logger.info(request.getServletPath());
logger.debug("Inside Clinic Controller Welcome Controller");

我错过了什么吗?

记录sn-p

2014-02-26 00:02:32.0135 DEBUG "http-bio-8080"-exec-7 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping – Matching patterns for request [/welcome.jsp] are [/welcome.*]
2014-02-26 00:02:32.0143 DEBUG "http-bio-8080"-exec-7 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping – Mapping [/welcome.jsp] to handler 'com.petclinic.controller.ClinicController@dd02e8'
2014-02-26 00:02:32.0152 DEBUG "http-bio-8080"-exec-7 org.springframework.web.servlet.DispatcherServlet – Last-Modified value for [/PetClinic/forms/welcome.jsp] is: -1
2014-02-26 00:02:32.0163 DEBUG "http-bio-8080"-exec-7 org.springframework.web.servlet.DispatcherServlet – DispatcherServlet with name 'dispatcher' processing GET request for [/PetClinic/forms/welcome.jsp]
2014-02-26 00:02:32.0193 DEBUG "http-bio-8080"-exec-7 org.springframework.web.bind.annotation.support.HandlerMethodInvoker – Invoking request handler method: public java.lang.String com.petclinic.controller.ClinicController.welcomeHandler(javax.servlet.http.HttpServletRequest)
Inside Welcome Controller
/forms
2014-02-26 00:02:32.0199 DEBUG "http-bio-8080"-exec-7 org.springframework.beans.factory.support.DefaultListableBeanFactory – Invoking afterPropertiesSet() on bean with name 'welcome'
2014-02-26 00:02:32.0200 DEBUG "http-bio-8080"-exec-7 org.springframework.web.servlet.DispatcherServlet – Rendering view [org.springframework.web.servlet.view.JstlView: name 'welcome'; URL [/WEB-INF/view/welcome.jsp]] in DispatcherServlet with name 'dispatcher'
2014-02-26 00:02:32.0211 DEBUG "http-bio-8080"-exec-7 org.springframework.web.servlet.view.JstlView – Forwarding to resource [/WEB-INF/view/welcome.jsp] in InternalResourceView 'welcome'
2014-02-26 00:02:32.0278 DEBUG "http-bio-8080"-exec-7 org.springframework.web.servlet.DispatcherServlet – Successfully completed request
2014-02-26 00:02:32.0280 DEBUG "http-bio-8080"-exec-7 org.springframework.orm.hibernate3.support.OpenSessionInViewFilter – Closing single Hibernate Session in OpenSessionInViewFilter

【问题讨论】:

为什么要设置两次logger级别? log4j.rootLogger=debug, info debug 也应该允许信息,我猜? 【参考方案1】:

1.) 您的 log4j.properties 文件位于何处?在构建 WAR 时,您的 log4j.properties 文件应该位于 WEB-INF/classes 文件夹的根目录中。

2.) 根据 archie hicox 的建议,您应该将 rootlogger 更改为 log4j.rootLogger=debug, file, stdout (without info)

【讨论】:

是的,它最初是 log4j.rootLogger=debug, file, stdout (without info) 我添加的信息只是为了检查。 log4j 属性文件位于 src 类路径文件夹中。我相信属性文件位于正确的文件夹中,这就是控制台中生成其他日志的原因。 如果是这样,请使用压缩工具打开您的 JAR,并检查文件是否位于 WEB-INF/classes 下。如果您使用与 IDE 连接的任何应用服务器,请转到部署文件夹并检查文件是否位于正确位置。有关您的系统环境的信息可能会有所帮助;) 尝试用 1.2 版本替换 log4j 2 jar 文件。现在工作。我相信 log4j 2 在配置上可能会有一些细微的差别。

以上是关于log4j 信息级别和调试不起作用的主要内容,如果未能解决你的问题,请参考以下文章

查尔斯调试不起作用

spring-boot - 外部 log4j 配置不起作用

在log4j.properties中每日appender文件路径,空间不起作用

Tomcat“Log4J”上的 Grails WAR 根本不起作用

多个保护级别在 WCF 中不起作用

System.out.print()不起作用,log4j仍然运行良好