Как позволить обработчику файлов root и named logger войти в один и тот же файл? - PullRequest
1 голос
/ 29 ноября 2011

Моя цель - использовать java.util.logging (jdk1.6)

  • записать все журналы в один файл журнала и
  • сделать ротацию журнала
  • может использовать% u в шаблоне файла, чтобы избежать потенциального конфликта файлов с другой программой

Я настроил корневой логгер и несколько именованных логгеров, где Обработчик корневого регистратора установлен на java.util.logging.FileHandler с настройками

java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.pattern = xxx.%u.log
java.util.logging.FileHandler.limit = 200000
java.util.logging.FileHandler.count = 20
java.util.logging.FileHandler.append = true

и обработчик именованных регистраторов установлен на customFileH с индивидуальными настройками

customFileH.class = java.util.logging.FileHandler
customFileH.level = ALL
customFileH.formatter = xxxFormat

Когда я запускаю программу, root logger запишет журнал в xxx.0.log,

в то время как именованный регистратор запишет журнал в xxx.0.log.1, как разные файлы журнала.

Даже я вынул "% u" в шаблоне файла; конфиги вращения файла примечаний, делали ли они записи в разные файлы журнала. (

Спасибо за любой комментарий заранее. :)

1 Ответ

1 голос
/ 18 августа 2014

Похоже, вы пытаетесь применить конфигурацию в стиле log4j к java.util.logging.Если вы хотите создать несколько FileHandler с разными форматерами, вам нужно использовать опцию config для установки каждого FileHandler.Создайте класс конфигурации:

package so;
import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import java.util.logging.XMLFormatter;

public final class LoggingConfig {

    /**
     * Pin the loggers.
     */
    private static final Logger root = Logger.getLogger("");
    private static final Logger named = Logger.getLogger("some.name");

    /**
     * Configure the loggers.
     * @throws Exception if there is a problem.
     */
    public LoggingConfig() throws Exception {
        root.addHandler(newRootHandler());
        named.addHandler(newNamedHandler());
    }

    private FileHandler newRootHandler() throws IOException {
        FileHandler f = new FileHandler("simple%g.%u.log", 200000, 20, true);
        f.setFormatter(new SimpleFormatter());
        return f;
    }

    private FileHandler newNamedHandler() throws IOException {
        FileHandler f = new FileHandler("xml%g.%u.log", 200000, 20, true);
        f.setFormatter(new XMLFormatter());
        return f;
    }
}

Затем добавьте следующее в свои logging.properties:

config=so.LoggingConfig

В противном случае вы можете создать подкласс FileHandler просто для создания нового имени класса, которое можно использоватьв ваших logging.properties.

Вы должны использовать опцию % g , чтобы различать повернутые журналы и% u для разрешения конфликтов.Из документации FileHandler:

Таким образом, если бы все три процесса пытались войти в систему, чтобы fred% u.% G.txt, они могли бы в конечном итоге использовать fred0.0.txt, fred1.0.txt,fred2.0.txt в качестве первого файла во вращающихся последовательностях.

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

...