【问题标题】:Tomcat6 doesn't seem to load my LogFormatter classTomcat6 似乎没有加载我的 LogFormatter 类
【发布时间】:2012-11-27 09:19:33
【问题描述】:

我想在 Tomcat6 中自定义我的日志消息,并创建了一个类“MyFormatter”,如下所示:

public class LogFormatter extends Formatter {

@Override
public String format(LogRecord record) {
    StringBuilder sb = new StringBuilder();

    sb.append("LOLCAT--")
            .append(new Date(record.getMillis()))
            .append(" \t")
            .append(record.getThreadID())
            .append(" \t")
            .append(record.getSourceMethodName())
            .append(" \t")
            .append(record.getSourceClassName())
            .append(" \t")
            .append(record.getLevel().getLocalizedName())
            .append(": ")
            .append(formatMessage(record))
            .append(System.getProperty("line.separator"));

    return sb.toString();
    }
}

我已将它打包成一个 .jar 并放在 ${catalina.home}/lib 中。

在我的 logging.properties 文件中,我添加了以下内容:

1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = lolcat.
1catalina.org.apache.juli.FileHandler.formatter = my.package.LogFormatter

在多次尝试不同的包装、不同的配置之后,我决定尝试内置的“org.apache.juli.OneLineFormatter”——这非常有效。所以配置应该没问题。

问题依然存在,为什么 Tomcat6 不加载我的类?

【问题讨论】:

  • 您看到了什么错误?你知道它是否可以加载它还是这仅仅是一个配置问题?
  • 日志根本没有说明这一点,它只是回退到默认的日志格式。我想我已经读过它会默默地执行此回退。
  • properties 文件说它应该在 my.package 中是这样吗?因为类那里没有任何包
  • package my.package; import java.util.Date; import java.util.logging.Formatter; import java.util.logging.LogRecord; 这是我遗漏的顶部。 jar 还包含文件夹结构 /my/package/LogFormatter.class
  • 我通过将 .jar 添加到“...\Java\jdk1.6.0_33\jre\lib\ext”来实现这一点。这可能是因为这个文件夹是在任何其他 Tomcat 内容之前加载的。但是,它可能不是将其保存在生产环境中的最佳位置。是否有任何其他文件夹/配置可以将其保留在 tomcat 文件夹中?

标签: java logging tomcat6 classloader java.util.logging


【解决方案1】:

我找到了解决办法。

在阅读了 Tomcat 和 Class Loading 之后,我发现 Tomcat 有一个遵循的顺序。是这样的;

引导程序 (/jre/lib/ext) -> 系统 (/catalina-home/bin/) -> 通用 (/catalina-home/lib) -> Webapps。

包含日志内容的tomcat-juli.jar是通过“系统”步骤加载的,因此当您将其他日志内容放在一起时,它会忽略它,因为它已经加载了。

然后解决方案是在 tomcat-juli.jar 加载之前将 .jar 放置在 /jre/lib/ext 中。'

编辑: 将它保存在 jre 文件夹中并不总是一个好主意,因此我发现最好的解决方案是将其放在背书目录中。

-Djava.endorsed.dirs=${catalina_home}/endorsed

这个认可的目录将在 System 类加载之前运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多