Использование API java.util.logging для регистрации разных уровней в отдельных файлах - PullRequest
5 голосов
/ 28 октября 2011

Я хотел бы знать, как использовать API java.util.logging, чтобы сообщение журнала записывалось в другой файл журнала в зависимости от используемого уровня. Если уровень INFO, то я хотел бы, чтобы сообщение было записано в /log/info.log и так далее. 3 определенных уровня являются серьезными, предупреждение и информация.

Ответы [ 3 ]

3 голосов
/ 28 октября 2011

Вы используете пользовательские 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, каждый из которых содержит только сообщения для каждого конкретного уровня журнала.

Обратите внимание, мне нравится внедрение зависимостейстилевой подход, требующий Level в конструкторе, чтобы вы не могли «забыть» вызвать .setLevel() при использовании этого подкласса.Я также отключил .setLevel(), потому что вызов его и изменение нарушило бы семантику подкласса "

Просто для полноты вы можете использовать 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);
    }
});

Лично мне все еще нравится подход подкласса лучше, он менее подвержен ошибкам и самодокументируетсяцель и намерение.

0 голосов
/ 28 октября 2011

Поскольку все говорят о log4j ... Вот более полезный ответ:

Добавьте разные дескрипторы (обработчики файлов для файлов) и установите уровни для обработчиков. Уровень для логгера должен позволить максимально многословному / расслабленному перейти на обработчики.

Я не использую файл свойств для настройки jul.Logger, а просто самодельный xml. Если вы не можете сделать это через файл свойств, просто используйте logger.getHandler () и установите соответствующие уровни.

0 голосов
/ 28 октября 2011

Предполагается, что вы используете log4j для ведения журналов. Вам нужно будет написать собственный appender и добавить его в каждый регистратор.

  • Простые инструкции

В пользовательском приложении у вас просто есть оператор 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

Это сделает именно то, что вам нужно.

...