system.setproperty在另一个类中静态方法调用后未修改记录器的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之前的行,它可以按预期工作。请注意,我还尝试在getStaticMethod()方法中将System.setProperty的代码块放置。

我知道system.properties都是静态变量,因此我必须相信,在MyThirdClass.getStaticMethod的方法调用过程中,JVM中发生的任何内容都在静态属性中锁定,然后才能更改它。

  1. 我是否正确理解JVM中正在正确发生的事情?
  2. 因为我无法控制实际生产中的所有入口点此程序的版本,我也不控制编译设置也无法发布-djava line命令来设置属性这样(我也已经确认的将起作用(我需要能够在MyThirdClass中以编程方式进行此操作。我是什么失踪/忽略,还是我只是不幸?

这个答案最初由OP 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);
    }
}

最新更新