4

我想在 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 不加载我的类?

4

1 回答 1

5

我找到了解决方案。

在阅读了 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

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

于 2012-11-27T11:13:07.500 回答