System.setProperty для регистратора не изменяется после вызова статического метода в другом классе - PullRequest
0 голосов
/ 27 апреля 2018

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

  1. Правильно ли я понимаю, что происходит в JVM?
  2. Так как я не контролирую все точки входа в фактическое производство версия этой программы, и я также не контролирую компиляцию настройки, и я не могу выполнить команду линии -Djava для установки свойств таким образом (который я также проверял, будет работать), я должен быть в состоянии сделать это программно в MyThirdClass. Что я отсутствует / пропускает, или мне просто не повезло?

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Этот ответ был первоначально отредактирован в приведенном выше вопросе ОП Брайан , я разместил это здесь и попросил его сделать это сам:

Для тех, кто хочет знать ответ, я добавил статический блок на класс 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);
  }
0 голосов
/ 27 апреля 2018

Когда вы вызываете статический метод, такой как 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);
    }
}
...