java.util.logging
使用するレベルに応じて異なるログファイルにログメッセージを書き込むために、APIの使用方法を知りたいです。レベルがINFOの場合、メッセージを/log/info.logなどに書き込みます。定義された3つのレベルは、重大、警告、および情報です。
3 に答える
カスタムHandlers
を使用してログ レコードを書き込みます。
これは、簡単ですが、構築できる完全な例です。
import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
public class LevelBasedFileHandler extends FileHandler
{
public LevelBasedFileHandler(final Level level) throws IOException, SecurityException
{
super();
super.setLevel(level);
}
public LevelBasedFileHandler(final String s, final Level level) throws IOException, SecurityException
{
super(s);
super.setLevel(level);
}
public LevelBasedFileHandler(final String s, final boolean b, final Level level) throws IOException, SecurityException
{
super(s, b);
super.setLevel(level);
}
public LevelBasedFileHandler(final String s, final int i, final int i1, final Level level) throws IOException, SecurityException
{
super(s, i, i1);
super.setLevel(level);
}
public LevelBasedFileHandler(final String s, final int i, final int i1, final boolean b, final Level level) throws IOException, SecurityException
{
super(s, i, i1, b);
super.setLevel(level);
}
@Override
public void setLevel() { throw new UnsupportedOperationException("Can't change after construction!"); }
// This is the important part that makes it work
// it also breaks the contract in the JavaDoc for FileHandler.setLevel()
@Override
public void publish(final LogRecord logRecord)
{
if (logRecord.getLevel().equals(super.getLevel())
{
super.publish(logRecord);
}
}
}
ここにそれを使用する方法があります
try
{
// I use the Anonymous logger here, but any named logger will work as well
final Logger l = Logger.getAnonymousLogger();
l.addHandler(new LevelBasedFileHandler("/tmp/info.log", Level.INFO));
l.addHandler(new LevelBasedFileHandler("/tmp/warn.log", Level.WARNING));
l.addHandler(new LevelBasedFileHandler("/tmp/server.log", Level.SEVERE));
l.info("This is an INFO message");
l.warning("This is a WARNING message");
l.severe("This is a SEVERE message");
}
catch (final IOException e)
{
// ignore this for this example, you should never do this in real code
}
/tmp
それぞれの特定のログ レベルのメッセージのみを含む3 つのファイルが得られます。
コンストラクターで を要求する依存性注入スタイルのアプローチが好きなので、このサブクラスを使用するときLevel
に呼び出すことを「忘れる」ことはできません。また、それを呼び出して変更するとサブクラスのセマンティクスが壊れるため、.setLevel()
無効にしました」.setLevel()
完全を期すために、 a を使用して同じことを達成できますjava.util.logging.Filter
。カプセル化されていませんが、代替手段です。それはより多くのコードとより冗長であるため、より正しく理解できません。
final FileHandler infoFileHandler = new FileHandler("/tmp/info.log");
infoFileHandler.setFilter(new Filter()
{
public boolean isLoggable(final LogRecord logRecord)
{
return logRecord.getLevel().equals(Level.INFO);
}
});
個人的には、サブクラスのアプローチの方が気に入っています。エラーが発生しにくく、目的と意図が自己文書化されています。
誰もがlog4jについて語っているので...もっと便利な答えがあります:
さまざまなハンドル (ファイルのファイル ハンドラー) を追加し、ハンドラーのレベルを設定します。ロガーのレベルは、ハンドラーに渡すために、最も詳細/緩和されたものを許可する必要があります。
jul.Logger のセットアップにはプロパティ ファイルを使用しませんが、自家製の xml だけを使用します。プロパティ ファイルを介して実行できない場合は、logger.getHandler() を使用して適切なレベルを設定します。
log4j を使用してログを作成するとします。カスタム アペンダーを作成し、それを各ロガーに追加する必要があります。
- 簡単な説明
カスタム アペンダーでは、ログ タイプを調べて必要なアクションを実行する if ステートメントを使用するだけです。特に、このニーズに非常に自然に対応するために拡張できる FileAppenders があります。http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/FileAppender.html
- よりエレガントな例
独自にコーディングするのではなく、単純に構成ファイルをセットアップしてみてください。
http://www.vaannila.com/log4j/log4j-file-appender-example-1.html
これはまさにあなたが必要とすることを行います。