The JavaDocs for java.util.logging.Level state:
The levels in descending order are:
- SEVERE(highest value)
- WARNING
- INFO
- CONFIG
- FINE
- FINER
- FINEST(lowest value)
Source
import java.util.logging.*;
class LoggingLevelsBlunder {
    public static void main(String[] args) {
        Logger logger = Logger.getAnonymousLogger();
        logger.setLevel(Level.FINER);
        System.out.println("Logging level is: " + logger.getLevel());
        for (int ii=0; ii<3; ii++) {
            logger.log(Level.FINE, ii + " " + (ii*ii));
            logger.log(Level.INFO, ii + " " + (ii*ii));
        }
    }
}
Output
Logging level is: FINER
Jun 11, 2011 9:39:23 PM LoggingLevelsBlunder main
INFO: 0 0
Jun 11, 2011 9:39:24 PM LoggingLevelsBlunder main
INFO: 1 1
Jun 11, 2011 9:39:24 PM LoggingLevelsBlunder main
INFO: 2 4
Press any key to continue . . .
Problem statement
My example sets the Level to FINER, so I was expecting to see 2 messages for each loop.  Instead I see a single message for each loop (the Level.FINE messages are missing).
Question
What needs changing in order to see the FINE (, FINER or FINEST) output?
Update (solution)
Thanks to Vineet Reynolds' answer, this version works according to my expectation.  It displays 3 x INFO messages, & 3 x FINE messages.
import java.util.logging.*;
class LoggingLevelsBlunder {
    public static void main(String[] args) {
        Logger logger = Logger.getAnonymousLogger();
        // LOG this level to the log
        logger.setLevel(Level.FINER);
        ConsoleHandler handler = new ConsoleHandler();
        // PUBLISH this level
        handler.setLevel(Level.FINER);
        logger.addHandler(handler);
        System.out.println("Logging level is: " + logger.getLevel());
        for (int ii=0; ii<3; ii++) {
            logger.log(Level.FINE, ii + " " + (ii*ii));
            logger.log(Level.INFO, ii + " " + (ii*ii));
        }
    }
}
 
     
     
     
     
    
 
     
     
     
     
    