代码之家  ›  专栏  ›  技术社区  ›  chris01

java.util.logging.Logger:“超时”后文件扩展名的增量

  •  0
  • chris01  · 技术社区  · 7 年前

    import java.util.logging.*;
    import java.io.*;
    
    public class LogTest 
    {
       public static void init () throws Exception
       {
          LogManager.getLogManager().reset ();
       }
    
       public static Logger get () throws Exception
       {
         Logger l = LogManager.getLogManager ().getLogger ("test");
         if (l == null)
         {
            l = Logger.getLogger ("test");
            FileHandler fh = new FileHandler ("test.log", 100000, 1, true);
            l.addHandler (fh);
            l.setLevel (Level.parse ("INFO"));
         }
         return l;
       }
    }
    

    我在main中一开始就调用LogTest.init()。 然后,我在需要记录日志的地方调用LogTest.get()。即使是一根线。

    LogTest.get().info ("blabla");
    

    test.log->测试日志1 测试日志1->测试日志2

    2 回复  |  直到 7 年前
        1
  •  2
  •   StephaneM    7 年前

    发生这种情况的原因可能在于:

    https://docs.oracle.com/javase/7/docs/api/java/util/logging/LogManager.html#getLogger(java.lang.String)

    还需要注意的是,如果没有对记录器的强引用,则与字符串名称关联的记录器可能随时被垃圾收集。此方法的调用方必须检查返回值是否为null,以便正确处理记录器已被垃圾收集的情况。

    由于您在一分钟或几分钟内没有访问记录器,并且代码中没有对记录器对象的引用,因此当您稍后调用 getLogger()

    如果@Mark有一个合适的单例作为指针,它就不会被垃圾收集。

        2
  •  1
  •   Mark    7 年前

    与您的问题无关,您的代码更像是一个带有静态方法的类,而不是一个单例。

    When is a singleton not a singleton :

    Singleton是一种有用的设计模式,它只允许 要创建多个实例。

    用你的密码你仍然可以打电话 new LogTest() one 要创建的实例。


    作为单例的代码如下所示:

    public class LogTest {
    
        private static LogTest theInstance;
    
        private LogTest() {
            LogManager.getLogManager().reset();
        }
    
        public static synchronized LogTest getInstance() {
            if(theInstance == null) {
                theInstance = new LogTest();
            }
            return theInstance;
        }
    
        public Logger getLogger() throws Exception {
            Logger l = LogManager.getLogManager().getLogger("test");
            if (l == null) {
                l = Logger.getLogger("test");
                FileHandler fh = new FileHandler("test.log", 100000, 1, true);
                l.addHandler(fh);
                l.setLevel(Level.parse("INFO"));
            }
            return l;
        }
    }
    

    当您想使用它时:

    LogTest.getInstance().getLogger().log(...);