Java log4j没有读取log4j.properties?

Java log4j没有读取log4j.properties?,java,tomcat,logging,log4j,Java,Tomcat,Logging,Log4j,我继承了一个Mavenized Java/Tomcat应用程序,在让日志按预期工作时遇到了困难。这可能是显而易见的,但正如人们所说,我是一个Java noob 问题似乎是log4j没有读取自己的配置文件(log4j.properties)。该文件在类路径中可用,并且(afaik)格式正确 下面是我的log4j.properties文件。值得一提的是,我从中逐字复制了它,以防我的原始.properties文件格式不正确 # Root logger option log4j.rootLogger=D

我继承了一个Mavenized Java/Tomcat应用程序,在让日志按预期工作时遇到了困难。这可能是显而易见的,但正如人们所说,我是一个Java noob

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

下面是我的log4j.properties文件。值得一提的是,我从中逐字复制了它,以防我的原始.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的代码。根据,所以我确保类能够加载资源(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错误消息(“无法为logger找到appenders”)仅因调用了
logger.error()
而出现。如果它被删除或注释,警告将消失


我还没有设置断点来逐步完成执行流,因为代码运行在一个由vagrant管理的Ubuntu盒上,我还没有为vagrant调试配置IDE。现在正在研究这个问题,如果有任何变化,我会更新这个问题。我有一半希望答案是显而易见的,但由于缺乏经验,我还没有找到答案。

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


您是否尝试过通过VM选项手动设置log4j?您可以通过设置
-Dlog4j.configuration来实现这一点=file:///path/To/Project/src/main/resources/log4j.properties
。(如果这样做有效,可能表明您的类没有拾取文件)另请参见:这实际上可能对您更有用。感谢您的提示-奇怪的是,显式设置VM选项不起作用。我启用了Dlog4j.debug,当属性文件被应用到许多其他正在启动的应用程序时,我试图实际配置的应用程序被完全跳过
    -Dlog4j.configuration="file:D:\Users\Projets\api\WebContent\WEB-INF\config\log4j_dev.xml"