Tuesday, September 29, 2020

Java Basic Util - Java Util Logging

1 Copied from source.

Hierarchical Loggers

Loggers are organized in a hierarchical namespace. The recommended namespace should follow the package naming style of the Java classes. For example we can create loggers with following names:
Logger1 > "com.logicbig"
Logger2 > "com.logicbig.MyClass2" > parent namespace= "com.logicbig"
Logger3 > "com.logicbig.MyClass3" > parent namespace= "com.logicbig"

In above example Logger1 is the parent of Logger2 and Logger3. If we setup Logger1 with specific properties (Level, Handler, Formatter etc) then those properties will be inherited to their children. A child is free to setup it's own properties to selectively override the parent ones.

An application will always has a 'root' logger. The root Logger (named "") has no parent.

Configuration, Setting up logging properties

We can load logging properties in one of following ways (in the order of priority):

  1. Using JVM system propertyjava.util.logging.config.class=com.logicbig.example.MyConfigClass.
    Java will load MyConfigClass during startup. The constructor of this class can use following method to initialize logging properties:
    LogManager.getLogManager().readConfiguration(InputStream);
    In this initializing class, we can also setup base/individual Loggers like this:
    Logger mainLogger = Logger.getLogger("com.logicbig.example");
    mainLogger.setLevel(Level.FINEST);
    mainLogger.addHandler(....);
     ....        
  2. Using JVM system propertyjava.util.logging.config.file = D:\myApp\logging.properties . Please see next for the format of such file.
  3. If neither of the above properties is defined then LogManager will use lib/logging.properties in the Java installation directory.
    For example C:\Java\jdk1.8.0_111\jre\lib\logging.properties:
    ############################################################
    #  	Default Logging Configuration File
    #
    # You can use a different file by specifying a filename
    # with the java.util.logging.config.file system property.
    # For example java -Djava.util.logging.config.file=myfile
    ############################################################
    
    ############################################################
    #  	Global properties
    ############################################################
    
    # "handlers" specifies a comma separated list of log Handler
    # classes.  These handlers will be installed during VM startup.
    # Note that these classes must be on the system classpath.
    # By default we only configure a ConsoleHandler, which will only
    # show messages at the INFO and above levels.
    handlers= java.util.logging.ConsoleHandler
    
    # To also add the FileHandler, use the following line instead.
    #handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
    
    # Default global logging level.
    # This specifies which kinds of events are logged across
    # all loggers.  For any given facility this global level
    # can be overriden by a facility specific level
    # Note that the ConsoleHandler also has a separate level
    # setting to limit messages printed to the console.
    .level= INFO
    
    ############################################################
    # Handler specific properties.
    # Describes specific configuration info for Handlers.
    ############################################################
    
    # default file output is in user's home directory.
    java.util.logging.FileHandler.pattern = %h/java%u.log
    java.util.logging.FileHandler.limit = 50000
    java.util.logging.FileHandler.count = 1
    java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
    
    # Limit the message that are printed on the console to INFO and above.
    java.util.logging.ConsoleHandler.level = INFO
    java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
    
    # Example to customize the SimpleFormatter output format
    # to print one-line log message like this:
    #     <level>: <log message> [<date/time>]
    #
    # java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n
    
    ############################################################
    # Facility specific properties.
    # Provides extra control for each logger.
    ############################################################
    
    # For example, set the com.xyz.foo logger to only log SEVERE
    # messages:
    com.xyz.foo.level = SEVERE

2 Copy the properties file from JRE folder.(e.g. C:\Java\jdk1.8.0_111\jre\lib\logging.properties) to project  (e.g.  MyProject/resources/logging.properties)

3 Modify it in your way.

4 Create the log util class as below:
package basic.util.log;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;

public class Log {

  private static Logger LOGGER;
  
  private static FileHandler fh = null;
  
  static {
      String path = Log.class.getClassLoader()
                  .getResource("logging.properties")
                  .getFile();
          System.setProperty("java.util.logging.config.file", path);
          
      LOGGER = Logger.getLogger(Logger.class.getName());
      
          SimpleDateFormat format = new SimpleDateFormat("yyyy-M-d_HHmmss");
          try {
          //String currPath = Log.class.getClass().getResource("/").getPath().replaceFirst("/", "");
          String currPath = System.getProperty("user.dir") + "/Log";
              fh = new FileHandler(currPath + format.format(Calendar.getInstance().getTime()) + ".log");
          } catch (Exception e) {
              e.printStackTrace();
          }

          fh.setFormatter(new SimpleFormatter());
          LOGGER.addHandler(fh);
         
  }
  
  public static void severe(Throwable throwable) {
  severe(throwable.getLocalizedMessage(), throwable);
  }
  
  public static void severe(String msg, Throwable throwable) {
  LOGGER.log(Level.SEVERE, throwable.getLocalizedMessage(), throwable);
  }
  
  public static void info(String msg) {
  LOGGER.info(msg);
  }
  
  public static void log(String msg) {
  LOGGER.finest(msg);
  }

  public static void main(String[] args) {
  System.out.println(Log.class.getClassLoader()
                  .getResource("logging.properties")
                  .getFile());
  System.out.println(Log.class.getClass().getResource("/")
  .getFile() );
  ;
      System.out.println("-- main method starts --");
      LOGGER.info("an info msg");
      LOGGER.warning("a warning msg");
      LOGGER.severe("a severe msg");
      System.out.println("-- main method end --");
  }

}







 

No comments:

Post a Comment