【发布时间】:2017-10-26 03:26:56
【问题描述】:
我继承了一个 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 的代码。根据the log4j FAQ, class path issues are a common source of problems in WAR apps,所以我确保该类能够加载资源(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 错误消息(“No appenders could be found for logger”)仅出现,因为logger.error() 调用。如果它被删除或评论,警告就会消失。
我还没有设置断点来单步执行执行流程,因为代码在 vagrant 托管的 Ubuntu 机器上运行,而且我还没有配置我的 IDE 以进行 vagrant 调试。现在正在处理这个问题,如果有任何变化,我会更新这个问题。我有一半希望答案是显而易见的,我只是由于缺乏经验而没有抓住。
【问题讨论】:
-
您是否尝试过通过 VM 选项手动设置 log4j?你可以通过设置
-Dlog4j.configuration=file:///path/To/Project/src/main/resources/log4j.properties来做到这一点。 (如果这有效,则可能表明您的班级没有拿起文件) -
另见here:这实际上可能对你更有用。
-
感谢您的提示 - 奇怪的是,明确设置 VM 选项不起作用。我启用了 Dlog4j.debug,虽然属性文件应用于许多其他正在启动的应用程序 - 我试图实际配置的应用程序被完全跳过