XMLFormatter in Java Logging API
In the software development cycle, always it is good to record the set of actions that are getting done. Recording the actions are called Logging. Logging in Java by using java.util.logging package(default) logs the data. Additionally, we have third-party frameworks likeLog4j, Logback, and tinylog, etc., Depends upon the requirements, preferences of selecting logging framework differ. In Java, java.util package is having the logging utility and the following imports are much necessary for logging are as follows:
import java.util.logging.ConsoleHandler; import java.util.logging.FileHandler; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.Logger;
Now, let us go through the specification of log message display via a ‘properties file’. Here inside a project, we can specify a properties file, and they keep track of maintaining logging functionality. Among that, “java.util.logging.ConsoleHandler.formatter” specifies the name of a Formatter class to use and the default setting is java.util.logging.SimpleFormatter, which is nothing but displaying log entries in the plain text. Here we are going to cover about XMLFormatter using LogRecord which is shown below as:
LogRecord logRecordInformation = new LogRecord(Level.INFO, “XMLFormatterTest”);
The LogRecord contains the following getter methods:
getLevel() – It can be Info/Warning etc., (Log level of the message)
All - 1 FINEST - 2 FINER - 3 FINE - 4 CONFIG - 5 INFO - 6 WARNING - 7 SEVERE. - 8 OFF - 9
getMessage() – Here it will display XMLFormatterTest for the example as we have given as
LogRecord logRecordInformation = new LogRecord(Level.INFO, "XMLFormatterTest");
getMillis() – 1616767447995
getSequenceNumber() – 0
We have additional methods that are as follows:
Method | Action Performed |
---|---|
getLoggerName() | It returns the name of the Logger. |
getParameters() | It returns the parameters to be inserted into the message of this LogRecord. |
getResourceBundle() | Displays the info If any used to localize the message of this LogRecord or else returns null. |
getResourceBundleName() | It displays the name of the ResourceBundle (if any) used to localize the message of this LogRecord or else returns null. |
getSequenceNumber() | It displays a sequence number |
getSourceClassName() | It displays the class name of the class logging the message represented by this LogRecord. |
Example 1:
Java
// Java Program demonstrating XML Formatter Logging API // Importing required libraries import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Locale; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.XMLFormatter; // Main class // XMLFormatterExample public class GFG { // Main driver method public static void main(String[] args) { // A Locale object represents a specific // geographical, political, or cultural region Let // us take Locale.ENGLISH as the default in this // program Locale englishLocale = Locale.getDefault(); // Try block to check for exceptions try { Locale.setDefault(Locale.ENGLISH); // Creating new object of GregorianCalendar // class GregorianCalendar calendar = new GregorianCalendar(); int calendarYear = calendar.get(Calendar.YEAR); // There are different levels of setting // loggerInformation default level is INFO. // If the value is not specified, for our // example we have kept as INFO // other available levels are // ALL - 1, // FINEST - 2, // FINER - 3, // FINE - 4, // CONFIG - 5, // INFO - 6, // WARNING - 7, // SEVERE - 8, // OFF - 9 LogRecord logRecordInformation = new LogRecord( Level.INFO, "XMLFormatterTest" ); // Display message for better readability System.out.println( "--------------------------------------" ); // Printing logger levels, message, // getMillis,getSequenceNumber System.out.println( "Logger level.." + logRecordInformation.getLevel()); System.out.println( "Message.." + logRecordInformation.getMessage()); System.out.println( "getMillis.." + logRecordInformation.getMillis()); System.out.println( "getSequenceNumber.." + logRecordInformation.getSequenceNumber()); // Display message for better readability System.out.println( "--------------------------------------" ); // As we are using XMLFormatter, it displays the // output in XML format. // It has higher visibility if used with UTF-8 // Now creating object of XMLFormatter class XMLFormatter formatter = new XMLFormatter(); String xmlFormatted = formatter.format(logRecordInformation); System.out.println(xmlFormatted); } // Executing the above code no matter // if there is exception or not finally { Locale.setDefault(englishLocale); } } } |
Output:
Example 2:
Java
// Java Program demonstrating XML Formatter Logging API // Importing required libraries import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.XMLFormatter; // Main class // XMLFormatterExample1 public class GFG { // Main driver method public static void main(String[] args) throws Exception { // Creating an object of XMLFormatter class XMLFormatter xmlFormatter = new XMLFormatter(); // Setting level to Info LogRecord logRecord = new LogRecord( Level.INFO, "Logrecord message to be printed in xml file.." ); // We can see the output of LogRecord in // logrecordxml.xml file FileHandler fileHandler = new FileHandler( "logrecordxml.xml" ); fileHandler.setFormatter(xmlFormatter); // Prepared data is displayed in the // logrecordxml.xml file fileHandler.publish(logRecord); // Lastly releasing out all the records // using the flush() method fileHandler.flush(); } } |
Output: Instead of printing in the console, we can print the same in the XML file as shown below
Conclusion:
XML notation is very helpful to read and understand log messages. Hence, XMLFormatter provides an efficient way to achieve the same. Many prefer to have XMLFormatter instead of SimpleFormatter which produces the output in the plain text format.