4

ロギングに使用java.util.loggingしています(log4jなどは使用したくありません)。

これは私の完全なプライベート logging.properties です。

handlers= java.util.logging.FileHandler
.level= INFO
java.util.logging.FileHandler.pattern = my.log
java.util.logging.FileHandler.limit = 500000
java.util.logging.FileHandler.count = 40
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter

これは私のプログラムのコードです:

public static Logger log = Logger.getLogger(MyClass.class.getName());
// Is there anything else to be init'ed here? 
// I don't. I just start using log directly in the code.

log.severe("something");
log.info("something else");

これにより、各ログメッセージが2行に表示されるため、これを試しました

Java ログ出力を 1 行に表示するにはどうすればよいですか?

最初の返信で LogFormatter クラスを正確にコピーしました。

logging.properties の 1 行を変更しました

java.util.logging.FileHandler.formatter = com.mycomp.myproj.LogFormatter;

これで、ログが XML で表示されるようになりました。FileHandler私は、 が私のものを気に入らないcom.mycomp.myproj.LogFormatterので、デフォルトの にデフォルト設定することを強く感じていますXMLFormatterFileHandlerLogFormatter クラスを使用していない理由を特定するにはどうすればよいですか?

4

6 に答える 6

5

FileHandler インスタンスのコード自体にフォーマッターを設定できます。

import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;

// please change name of your own choice
Logger log = Logger.getLogger("CustomLogger"); 
log.setUseParentHandlers(false);
log.setLevel(Level.ALL);

FileHandler handler = new FileHandler("[log_file_location]");
handler.setFormatter(new CustomFormatter()); // set formatter
log.addHandler(handler);

log.info("test message");

handler.close(); // close the handler at some later point in your application.

CustomFormatter クラスは次のように定義されます。

import java.util.logging.Formatter;
import java.util.logging.LogRecord;

public class CustomFormatter extends Formatter {

    @Override
    public String format(LogRecord record) {
        StringBuffer buffer = new StringBuffer();
        buffer.append(record.getMessage());
        return buffer.toString();
    }

}

CustomFormatter でコーディングして、任意の形式でメッセージを出力できます。お役に立てれば。

于 2013-04-18T23:41:26.613 に答える
2

わかりました、これも私を本当に悩ませ、私を夢中にさせていました。私はスペルを際限なくチェックし、Google検索などを行っていました. これがあなたの答えだと確信しています。

為に :

java.util.logging.FileHandler.formatter = com.mycomp.myproj.LogFormatter;

それは次のようになります。

java.util.logging.FileHandler.formatter = com.mycomp.myproj.LogFormatter

トレーニング ";" を削除します。クラス名と正確に一致する必要があるようです。他の誰かが、末尾に空白文字があると不平を言っているのを見ました。これが私の問題でした。より良いエラーメッセージが役に立ちました。

乾杯 - マーク

于 2014-08-27T13:18:20.913 に答える
1

com.mycomp.myproj.LogFormatter がシステム クラス パスにありません。

LogManager は、クラスをロードするために次の呼び出しを行います。

Formatter getFormatterProperty(String name, Formatter defaultValue) {
        String val = getProperty(name);
        try {
            if (val != null) {
                Class<?> clz = ClassLoader.getSystemClassLoader().loadClass(val);
                return (Formatter) clz.newInstance();
            }
        } catch (Exception ex) {
            // We got one of a variety of exceptions in creating the
            // class or creating an instance.
            // Drop through.
        }
        // We got an exception.  Return the defaultValue.
        return defaultValue;
}

クラス LogFormatter がシステムのクラスパスにあることを確認する必要があります。

于 2015-12-31T13:53:47.367 に答える
0

これは現時点では関係ないかもしれませんが、最近、フォーマット内の$が原因で問題が発生し、解析できず、デフォルトのフォーマットに戻ってしまうという 1 つの問題を発見しました。もともと持っていた

[%1$tF %1$tT] [%4$-7s] %5$s %n

logging.propertiesファイルでは期待どおりに動作しませんでしたが、

[%1\$tF %1\$tT] [%4\$-7s] %5\$s %n

これは で完全に機能しまし\$た。将来、他の人に役立つかもしれません。

于 2022-02-18T12:32:07.953 に答える