System.setProperty для регистратора не изменяется после вызова статического метода в другом классе
У меня есть программа, в которой мне нужно установить форматирование регистратора, но так как есть несколько точек входа (я не контролирую их все), я хочу разместить System.setProperty()
вызовите конструктор класса, где сходятся все точки входа.
Основной класс
public static void main(String[] args) throws Exception {
String foo = "bar";
String baz = "boo";
static final String FORMATTER_CONFIG = "%1$tb %1$td, %1$tY %1$tr %4$s: %5$s%n";
SomeClass sc = new SomeClass();
sc.method1(foo);
sc.method2(baz);
try {
SomeOtherClass soc = SomeOtherClass.newInstance();
} catch (Exception e) {;
}
// Next line will update the property of the logging formatter for this instance
System.setProperty("java.util.logging.SimpleFormatter.format", FORMATTER_CONFIG);
MyThirdClass mtc = MyThirdClass.getStaticMethod(foo, baz);
Logger logger = Logger.getLogger("myProject.main");
Handler h = new FileHandler("LogHere.txt");
h.setFormatter(new SimpleFormatter());
logger.addHandler(h);
logger.setLevel(Level.INFO);
logger.info("Info level log");
logger.fine("Fine level log");
logger.finer("Finer level log");
logger.finest("Finest level log");
}
Конструктор MyThirdClass
:
public MyThirdClass() throws SecurityException {
this.classStaticVar = EntirelyDifferentClass.getVar();
logger = Logger.getLogger(this.getClass().getName());
Handler h = null;
try {
h = new FileHandler("MTC_LogHere.txt");
} catch (IOException ex) {
logger.warning("Failed to initialize custom FileHandler for MTC_LogHere.txt");
}
h.setFormatter(new SimpleFormatter());
logger.addHandler(h);
logger.setLevel(Level.INFO);
}
Я хочу позвонить System.setProperty
как первая строка конструктора в MyThirdClass
(до звонка EntirelyDifferentClass
) но когда я делаю, регистрация не отформатирована в соответствии с пользовательскими правилами. Если я оставлю это прямо там, где он есть, линия до вызова MyThirdClass
в основном методе он работает как задумано. Обратите внимание, что я также попытался поставить блок кода для System.setProperty
в getStaticMethod()
метод.
Я понимаю что system.properties
все статические переменные, поэтому я должен верить, что все, что происходит в JVM во время вызова метода MyThirdClass.getStaticMethod
блокирует статические свойства, прежде чем я смогу его изменить.
- Правильно ли я понимаю, что происходит в JVM?
- Так как я не контролирую все точки входа в реальной рабочей версии этой программы, а также не контролирую настройки компиляции и не могу выполнить команду строки -Djava для установки свойств таким образом (что я также проверил будет работать) Я должен быть в состоянии сделать это программно в
MyThirdClass
, Что я пропускаю / пропускаю, или мне просто не повезло?
2 ответа
Этот ответ был первоначально отредактирован в вопросе выше Bryan, я разместил его здесь и попросил его сделать это сам:
Для тех, кто хочет знать ответ, я добавил статический блок на уровне класса
MyThirdClass
:protected static Logger logger = null; static { System.setProperty("java.util.logging.SimpleFormatter.format", FORMATTER_CONFIG); logger = Logger.getLogger("myProject.MyThirdClass"); Handler h = null; try { h = new FileHandler("LogHere.txt"); } catch (Exception ex) { System.out.println("Exception"); } h.setFormatter(new SimpleFormatter()); logger.addHandler(h); logger.setLevel(Constants.LOGGING_LEVEL); }
Когда вы вызываете статический метод, такой как getStaticMethod()
в вашем случае экземпляр класса не создается, и поэтому конструктор не вызывается.
Попробуйте положить System.setProperty()
в статическом методе, а не в конструкторе.
Например:
import java.util.logging.*;
public class Main {
public static void main(String[] args) {
SomeClass.staticMethod();
Logger logger = Logger.getLogger(Main.class.getName());
logger.setLevel(Level.INFO);
logger.info("Info level log");
}
}
public class SomeClass {
public static void staticMethod() {
final String FORMATTER_CONFIG = "%1$tb %1$td, %1$tY %1$tr %4$s: %5$s%n";
System.setProperty("java.util.logging.SimpleFormatter.format", FORMATTER_CONFIG);
}
}