Как использовать значения System Propery как часть шаблона обработчика журнала

Я использую java.util.logging.logger в качестве механизма ведения журнала для своего приложения. Я хочу установить системное свойство как часть значения шаблона обработчика, который упоминается в файле logging.properties, как показано ниже:

java.util.logging.FileHandler.pattern = path/${custom.home}/logs/server.log

Я попытался установить указанное выше значение, но оно не разрешает свойство custom.home, вместо этого используйте его как строку и выдает ошибку ниже при инициализации обработчика.

Can't load log handler "java.util.logging.FileHandler"
java.nio.file.NoSuchFileException: path/${custom.home}/logs/server.log.lck
java.nio.file.NoSuchFileException: path/${custom.home}/logs/server.log.lck
    at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
    at sun.nio.fs.UnixFileSystemProvider.newFileChannel(UnixFileSystemProvider.java:177)
    at java.nio.channels.FileChannel.open(FileChannel.java:287)
    at java.nio.channels.FileChannel.open(FileChannel.java:335)
    at java.util.logging.FileHandler.openFiles(FileHandler.java:459)
    at java.util.logging.FileHandler.<init>(FileHandler.java:263)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at java.util.logging.LogManager$5.run(LogManager.java:966)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.util.logging.LogManager.loadLoggerHandlers(LogManager.java:958)
    at java.util.logging.LogManager.initializeGlobalHandlers(LogManager.java:1578)
    at java.util.logging.LogManager.access$1500(LogManager.java:145)
    at java.util.logging.LogManager$RootLogger.accessCheckedHandlers(LogManager.java:1667)
    at java.util.logging.Logger.getHandlers(Logger.java:1777)
    at java.util.logging.Logger.log(Logger.java:735)
    at java.util.logging.Logger.doLog(Logger.java:765)
    at java.util.logging.Logger.log(Logger.java:788)

Есть ли способ выполнить это требование?

Спасибо, Данеш.


person daneshk    schedule 25.04.2017    source источник
comment
См. stackoverflow.com/questions/13066042/   -  person Snehal Patel    schedule 25.04.2017


Ответы (2)


Путь path/${custom.home}/logs/server.log не существует! Использовать:

`java.util.logging.FileHandler.pattern = "path/"+`System.getProperty("user.home")+"/logs/server.log";

вместо. Но eclipse говорит: «FileHander.pattern не виден!»

person Niton    schedule 25.04.2017

Исходя из вашего вопроса, я предполагаю, что вы вручную установили системное свойство с именем custom_home в качестве аргумента запуска. Затем вы можете создать подкласс java.util.logging .FileHandler для распознавания нового синтаксиса шаблона:

public class EnvFileHandler extends FileHandler {

    private static String pattern() throws IOException {
        String prefix = EnvFileHandler.class.getName();
        String v = LogManager.getLogManager().getProperty(prefix +".pattern");
        return v.replace("${custom_home}", System.getProperty("custom_home", "%hjava.log"));
    }

    public EnvFileHandler() throws IOException {
        super(pattern());
    }
}

Затем вместо установки FileHandler вы устанавливаете подкласс FileHandler, используя ваши logging.properties.

.handlers=package.of.EnvFileHandler
package.of.EnvFileHandler.pattern=path/${custom_home}/logs/server.log

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

person jmehrens    schedule 25.04.2017