4

java.util.logging.Logger用于记录不同级别的各种消息(例如,通过方法.fine()、、、、)。我想了解每个级别记录了多少消息。是否可以编写我自己的课程,例如:.finer().info().warning()

public class MyLogger extends Logger
{
   int infoCounter = 0;

   @Override
   public void info(String msg)
   {
      super.info(msg);
      infoCounter++; 
   }
}
4

1 回答 1

4

答案是否定的,这是不可能的
你现在这样做的方式很好(当然,一旦同步)。

还有一个替代方案:不是扩展 Logger,而是扩展 java.util.logging.Handler,然后:

  1. 覆盖 publish() 方法

  2. 实现flush()和close()

  3. 创建一个按级别计算消息的方法

    我尝试了这个并对其进行了测试,它确实有效:

    import java.util.ArrayList;
    import java.util.List;
    import java.util.logging.Handler;    
    import java.util.logging.Level;
    import java.util.logging.LogRecord;
    
    public class CountHandler extends Handler {
    
    List<LogRecord> records = new ArrayList<LogRecord>();
    
        @Override
        public void publish(LogRecord record) {
            records.add(record);
        }
    
        public int howMany(Level level) {
            int howMany = 0;
            for(LogRecord record : records) {
                if (record.getLevel().intValue() == level.intValue()) {
                    howMany++;
                }
            }
            return howMany;
        }
    
        @Override
        public void flush() {
    
        }
    
        @Override
        public void close() throws SecurityException {
    
        }
    
    }
    

这样做的好处是您不必为每个级别重写方法。唯一的事情是您必须将此处理程序添加到每个记录器:

CountHandler messageCounter= new CountHandler();
        logger.addHandler(messageCounter);

所以,把它当作它的价值。无论你做什么,你都必须编写自己的类。

于 2013-08-27T18:01:27.623 回答