【问题标题】:System.setErr() doesn't restore console logging after stderr closed在 stderr 关闭后 System.setErr() 不会恢复控制台日志记录
【发布时间】:2016-03-14 01:57:47
【问题描述】:

我的应用程序使用System.setErr()stderr 更改为最终将关闭的流。关闭后,我立即再次使用System.setErr()stderr 更改为工作流,这适用于我的代码执行System.err.println() 之类的操作,但使用java.util.logging 登录到控制台(即@ 987654329@) 不再有效。

【问题讨论】:

    标签: java logging stderr java.util.logging


    【解决方案1】:
    System.err.println("This is written to stderr");
    
    // this is stderr
    PrintStream oldErr = System.err;
    
    try {
        System.setErr(new PrintStream(new File("/path/to/file")));
    } catch(Exception e) {
    }
    
    
    System.err.println("This is written to the file");
    
    // note that System.err wouldn't work here because System.err is no longer stderr
    // but you preserved stderr in oldErr
    try {
        System.setErr(oldErr);
    } catch(Exception e) {
    }
    
    System.err.println("This is written to stderr again");
    

    【讨论】:

      【解决方案2】:

      ConsoleHandler 在构造过程中捕获对 System.err 的引用。另一种解决方案是替换日志树中的所有ConsoleHandler。

          LogManager m = LogManager.getLogManager();
          synchronized (m) {
              Enumeration<String> names = m.getLoggerNames();
              while (names.hasMoreElements()) {
                  Logger logger = m.getLogger(names.nextElement());
                  if (logger != null) {
                      for (Handler h : logger.getHandlers()) {
                          if (h.getClass() == ConsoleHandler.class) {
                              logger.removeHandler(h);
                              h.close();
                              logger.addHandler(new ConsoleHandler());
                          }
                      }
                  }
              }
          }
      

      【讨论】:

        【解决方案3】:

        为了解决这个问题,我不得不re-read the logging configuration file然后自己放回console logging handler

        import java.util.logging.ConsoleHandler;
        import java.util.logging.Loggger;
        import java.util.logging.LogManager;
        
        ...
        
        System.setErr(otherStream);
        
        try {
            LogManager.getLogManager().readConfiguration();
        }
        catch(java.io.IOException e) {
            // ...
        }
        
        Logger.getGlobal().addHandler(new ConsoleHandler());
        

        【讨论】:

          猜你喜欢
          • 2016-09-07
          • 1970-01-01
          • 1970-01-01
          • 2018-07-10
          • 2012-05-29
          • 2022-10-18
          • 2021-06-01
          • 1970-01-01
          • 2017-03-31
          相关资源
          最近更新 更多