Журнал Java - как перенаправить вывод в пользовательский файл журнала для регистратора? - PullRequest
21 голосов
/ 24 ноября 2011

У меня есть вопрос о конфигурации ведения журнала jdk.У меня есть EJB (развернутый в glassfish), который использует JDK Logging для вывода сообщений.Поэтому я использую именованный регистратор с кодом, подобным следующему:

private static Logger logger = Logger.getLogger("org.imixs.workflow");
.....
       logger.fine(" some info...");
....

Я знаю, что могу настроить уровень журнала для своего регистратора, добавив следующую строку в файл logging.properties из Glassfish:

.....
org.imixs.workflow.level=FINE

Но как мне указать выходной файл для моего регистратора?Я хотел бы поместить все сообщения из регистратора с именем 'org.imixs.workflow' в отдельный файл.Возможно ли это?

Спасибо за любую помощь

Ответы [ 3 ]

33 голосов
/ 24 ноября 2011

для этого можно использовать слегка запутанное свойство pattern FileHandler

handlers=java.util.logging.FileHandler
# Default global logging level. 
.level=INFO

#logging level for the foo.bar package
foo.bar.level=CONFIG 
java.util.logging.FileHandler.pattern=%h/java%u.log

Шаблон состоит из строки, содержащей следующие специальные компоненты, которые будут заменены во время выполнения:

"/" разделитель локальных имен

"% t" системный временный каталог

"% h" значение системного свойства "user.home"

"% g" номер поколения для различения повернутых журналов

"% u" уникальный номер для разрешения конфликтов

"%%" переводится на один знак процента "%"

Если вы хотите войти в несколько файлов, вы можете сделать это, настроив несколько обработчиков для нескольких именованных регистраторов

#FileHandler for file1    
java.util.logging.FileHandler.pattern = logging_property_test.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter

#FileHandler for file2
logging.FileHandler2.pattern = logging_property_test2.log
logging.FileHandler2.limit = 50000
FileHandler.count = 1
logging.FileHandler2.formatter = java.util.logging.SimpleFormatter


#setting handler for logger1
logging.PropertyTestingLogger.handlers=java.util.logging.FileHandler

#setting handler for logger2
logging.PropertyTestingLogger2.handlers=logging.FileHandler2

Как вы видите, хитрость заключается в том, что существует logging.FileHandler2, который является пользовательским классом и ничего не делает, но расширяет FileHandler

package logging;

import java.io.IOException;
import java.util.logging.FileHandler;

public class FileHandler2 extends FileHandler {

    public FileHandler2() throws IOException, SecurityException {
        super();
    }

}

Фон : к сожалению, создатели Java не ожидали, что кто-нибудь войдет в несколько файлов. Если вы посмотрите на источник java.util.logging.FileHandler, вы обнаружите, что свойство pattern загружается именем класса:

public class FileHandler extends StreamHandler {

   private String pattern;

   private void configure() {

        String cname = getClass().getName();
        pattern = manager.getStringProperty(cname + ".pattern", "%h/java%u.log");
11 голосов
/ 24 ноября 2011

Вы должны использовать FileHandler .

FileHandler fileHandler = new FileHandler("myLogFile");
logger.addHandler(fileHandler);

См. Пример хранилища , где приведены примеры настройки логгеров.

И вы можете найти эти ответы полезными для настройки из файла свойств.

5 голосов
/ 12 января 2016

С java.util.logging это НЕ возможно, просто изменив файл конфигурации. К сожалению, вы должны расширить FileHandler и настроить этот обработчик для фильтрации того, что вы хотите регистрировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...