【问题标题】:Tomcat App says "Unable to configure the logging system. No log.properties was found."Tomcat 应用程序显示“无法配置日志系统。未找到 log.properties。”
【发布时间】:2010-12-10 08:06:41
【问题描述】:

我有一个嵌入式 tomcat 应用程序,每当我启动它时,我都会看到此错误两次打印到控制台:

Unable to configure the logging system.  No log.properties was found.

这似乎很愚蠢,但我进行了一些谷歌搜索并搜索了 stackoverflow,但似乎找不到遇到此问题的人。

我的主类大致是这样的:

public class AuthServerEntryPoint {
  static {
    org.apache.log4j.PropertyConfigurator.configure("conf/log4j.properties");
  }
public static void main(String[] args) {
  // ...
}

“conf/log4j.properties”包含一个看似有效的配置:

log4j.appender.mainAppend=org.apache.log4j.ConsoleAppender
log4j.appender.mainAppend.layout=org.apache.log4j.PatternLayout
log4j.appender.mainAppend.layout.ConversionPattern=%d %p [%t] %c -- %m%n 

log4j.appender.fileAppend=org.apache.log4j.FileAppender
log4j.appender.fileAppend.layout=org.apache.log4j.PatternLayout
log4j.appender.fileAppend.layout.ConversionPattern=%d %p [%t] %c - %m%n 
log4j.appender.fileAppend.file=logs/myservice.log

log4j.rootLogger = info, fileAppend
log4j.logger.com.mycompany.myservice = debug, fileAppend

日志记录确实有效 - 即,日志已正确写入 myservice.log。那么是什么给出的呢?

谢谢! -卡尔

【问题讨论】:

  • 另外,顺便说一句,我在 log4j 源中搜索了这条消息但找不到它,这让我觉得 tomcat 正在做一些奇怪的事情。
  • 您的日志记录有效,但 Tomcat 的日志无效。
  • 我想通了 - 我很尴尬地说,我实际上并没有使用 TomcatServletContainer,而是一个内部开发的扩展它的类。我几乎不知道,它正在做一些疯狂的 foo 来尝试设置日志记录 - 这就是要求 log.properties 文件的原因。由于我公司以外的任何人都没有希望弄清楚这一点,因此我将正确答案授予最有帮助且几乎正确的回答。谢谢大家!

标签: java tomcat logging log4j


【解决方案1】:

默认情况下,log4j 将在类路径中查找日志记录属性文件。将您的 webapp 的日志记录属性配置文件放入其 WEB-INF/classes 目录;例如

$CATALINA_HOME/webapps/<yourApp>/WEB-INF/classes/log4j.properties

这是参考文档推荐的让 webapp 使用 Log4j 的简单方法。这是我自己用于 webapp 日志记录的方法。

还有多种其他方法可以在 Tomcat 上配置 Log4j 日志记录。您的 Tomcat 可能已(部分)配置为使用其中之一,但有些事情做得不太正确。

通过系统属性配置 Tomcat 的 log4j 日志记录是一种避免弄清楚 log4j 在哪里寻找的选项......以及出了什么问题。但是您随后会被困在创建/使用自定义启动脚本或必须记住在启动 Tomcat 之前设置环境变量。

参考资料:

【讨论】:

  • 我尝试将“log.properties”和“log4j.properties”都放在 WEB-INF/classes 目录中,但都没有让这个错误消息消失。即使确实如此,这也不能解释为什么上面的代码不起作用——我明确地告诉它在哪里可以找到文件,并且它显然正在找到它,因为它正在记录到正确的文件。由于该命令以静态方式运行,因此在初始化记录器本身之前,我看不到任何记录。不过感谢您的建议。
  • 您原来的问题是指 conf/log4j.properties。您是否尝试过在 classes 文件夹中创建一个 conf 目录并将配置文件放在那里。
  • @cmyers - 尝试摆脱对PropertyConfigurator.configure()的呼叫。它可能正在解析当前目录(无论可能在哪里)中的路径“conf/log4j.properties”。此外,您不应将日志记录属性文件位置硬连接到源代码中。
【解决方案2】:

嵌入式 Tomcat 应用程序,您的意思是您是从 Java 代码启动 Tomcat 并使用 org.apache.catalina.startup.Embedded 类吗?

如果是,我的猜测是 Tomcat 在使用脚本时可能无法找到在 catalina.sh(或等效)中设置的日志记录配置文件:

LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties"

奇怪的是这个文件被称为logging.properties,而不是log.properties,所以我真的不确定。不过我没有检查 Tomcat 的来源,也许他们在那里做了某种黑魔法。

您能否尝试将 $CATALINA_BASE/conf/logging.properties 重命名为 log.properties(或不重命名)并将其放在应用程序的类路径中(或设置 -Djava.util.logging.config.file)?

【讨论】:

  • 感谢您的建议 - 我正在从 java 代码中调用 tomcat,所以我只是用 main 运行我的类,它有一个启动的 TomcatServletContainer 对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 2018-01-10
  • 1970-01-01
  • 2016-09-28
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多