我继承了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进行流浪调试。现在正在努力,如果有任何变化,我会更新这个问题。我一半希望答案是显而易见的,因为我没有经验,所以我没有抓到。
答案 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"