log4j没有读取log4j.properties?

时间:2017-05-25 12:56:48

标签: java tomcat logging log4j

我继承了Mavenized Java / Tomcat应用程序,但我无法按预期正常工作。这可能是显而易见的,但就是这样 - 我是一个Java菜鸟。

问题出现是因为log4j没有读取自己的配置文件(log4j.properties)。该文件在类路径中可用,并且(afaik)格式正确。

下面是我的log4j.properties文件。为了它的价值,我从this post on Mkyong's site逐字复制它,以防我的原始.properties文件以某种方式格式错误。

# Root logger option
log4j.rootLogger=DEBUG, stdout

# 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=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

路径:

/src/main/resources/log4j.properties

父类中的记录器声明:

public class MyParentClass extends HttpServlet{
    protected static final String CHARSET = "UTF-8";
    static Logger logger = Logger.getLogger(MyParentClass.class);

以下是调用Logger / log4j的代码。根据{{​​3}},所以我确保该类能够加载资源(log4j.properties)并将其打印到STDOUT。

public class MyChildClass extends MyParentClass {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //testing output
        System.out.println("SYSTEM.OUT.PRINTLN");
        logger.info("LOGGER.INFO");
        logger.debug("LOGGER.DEBUG");
        logger.trace("LOGGER.TRACE");
        logger.error("LOGGER.ERROR");
        logger.warn("LOGGER.WARN");

        // reading log4j.properties
        java.io.InputStream propertiesStream = this.getClass().getClassLoader().getResourceAsStream("log4j.properties");
        java.util.Scanner s = new java.util.Scanner(propertiesStream).useDelimiter("\\A");
        String result = s.hasNext() ? s.next() : "";

        // writing log4j.properties to stdout
        System.out.println("---CONTENTS OF log4j.properties---");
        System.out.println(result);
        System.out.println("---END CONTENTS---");

结果:

SYSTEM.OUT.PRINTLN
log4j:WARN No appenders could be found for logger (com.company.client.project.web.MyParentClass).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
---CONTENTS OF log4j.properties---
# Root logger option
log4j.rootLogger=DEBUG, stdout

# 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=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
---END CONTENTS---

所有可见输出均来自显式System.out.println()次调用。

另一个可能相关的数据点:log4j appenders错误消息(“找不到记录器的appenders”)由于logger.error()调用而出现 。如果它被删除或评论,则警告消失。

我还没有设置断点来逐步完成执行流程,因为代码在一个流氓托管的Ubuntu框上运行,而我还没有配置我的IDE进行流浪调试。现在正在努力,如果有任何变化,我会更新这个问题。我一半希望答案是显而易见的,因为我没有经验,所以我没有抓到。

1 个答案:

答案 0 :(得分:0)

有时 log4j 不会在 tomcat 启动时自动加载,只是因为服务器看不到 log4j 属性文件。需要手动将 log4j 属性文件配置的路径设置为 java 选项或 eclipse 或 intellij VM 选项。 就我而言,我必须这样做(我在 Windows 上)

    -Dlog4j.configuration="file:D:\Users\Projets\api\WebContent\WEB-INF\config\log4j_dev.xml"