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とクラスローディングについて読んだ後、Tomcatが従う順序があることがわかりました。こんなふうになります;

ブートストラップ(/ jre / lib / ext)->システム(/ catalina-home / bin /)->共通(/ catalina-home / lib)->Webapps。

ロギング関連のものを含むtomcat-juli.jarは、「システム」ステップでロードされるため、他のロギング関連のものを共通に配置すると、それは無視され、すでにロードされています。

解決策は、tomcat-juli.jarが別名/ jre / lib/extにロードされる前に.jarを配置することです。

編集:それをjreフォルダーに保持することは必ずしも良い考えではないので、私はそれを承認されたディレクトリーに置くことが最善の解決策であることに気づきました。

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

この承認されたディレクトリは、システムクラスがロードされる前に実行されます。

于 2012-11-27T11:13:07.500 に答える