Pages

Thursday, December 3, 2020

Java Util Logging - Loading logging.properties With Log Levels

1. Overview

In this article, You'll learn how to load and set up the logging.properties file in java using Java Util Logging Library. Basically, Logging api helps to write the application activities and several variables values into a file as per the application.


Basically, The logging concepts works based on the log levels and mainly configuration given inside the logging.properties.


Logs information is displayed based on the log levels propery. If you give log level "debug" then all the info such as debug, info, warn, error and fatal. All log content is written to the log file or console.


Typically, the application log file name will be as "application.log" or "app.log" or "server.log". This file naming convention will be changing from company to company.

Java 8 added easy trick to use Java Logging api instantly. All application uses the log4j api for logging.

Java 8 Util Logging - Loading logging.properties With Log Levels


2. Loading logging.properties From Absolute Path

First, Create a sample logging.properties file as below with the console file appender and log level is INFO.

handlers= java.util.logging.ConsoleHandler

.level= INFO
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

com.javaprogramto.logging.level=INFO


This file placed under the folder "/Users/CoreJava/src/main/resources/custom/" which is not the application classpath. So, to tell to the util logger, you must set logger properties file location to system property "java.util.logging.config.file". So that Logger util api knows the location of the property file to be loaded.

package com.javaprogramto.logging.util;

import java.util.logging.Logger;

public class LoadLoggingPropertiesFIle {

    private static Logger logger;


    public static void main(String[] args) {

        logger.info("Hello, I am info logger.");

        logger.warning("Hello, no date is provided. So, taking the system date as DOJ");

        logger.severe("Error message. Can not connect to the service DateAPI.");

    }

    static {

        // Setting the log file location to the system varaible.
        System.setProperty("java.util.logging.config.file",
                "/Users/CoreJava/src/main/resources/custom/logging.properties");


        logger = Logger.getLogger(LoadLoggingPropertiesFIle.class.getName());
    }
}

Output:
Aug 10, 2020 11:58:54 AM com.javaprogramto.logging.util.LoadLoggingPropertiesFIle main
INFO: Hello, I am info logger.
Aug 10, 2020 11:58:54 AM com.javaprogramto.logging.util.LoadLoggingPropertiesFIle main
WARNING: Hello, no date is provided. So, taking the system date as DOJ
Aug 10, 2020 11:58:54 AM com.javaprogramto.logging.util.LoadLoggingPropertiesFIle main
SEVERE: Error message. Can not connect to the service DateAPI.

Look at the logger console output which is pretty easy to understand. It starts with the time that log has been generated. Even if you look at after a few days, still you can understand the error event that happened.


If the location is set to the property does not exist then it will not throw any error just ignores the logger object.


In the logging.properties file we have given the log level as "com.javaprogramto.logging.level=INFO" so that we are seeing all the logs levels in the console.


Let us change it to "com.javaprogramto.logging.level=SEVERE". Now we should see only the error messages.


let us run the code and see the output.
Aug 10, 2020 12:06:56 PM com.javaprogramto.logging.util.LoadLoggingPropertiesFIle main
SEVERE: Error message. Can not connect to the service DateAPI.

3. Loading logging.properties From Classpath


Next, let us keep the logging.properties file under the application classpath.

Application classpath: src/main/resources/logging.properties

handlers= java.util.logging.ConsoleHandler
.level= INFO
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

com.javaprogramto.logging.level=SEVERE

Now, You should not use the absolute path to load this file using a system property. Logging api provides another way to load the file classpath using it's api classes and methods.

Understand now, how to get the file path from classloader api.
package com.javaprogramto.logging.util;

import java.util.logging.Logger;

public class LoadLoggingPropertiesFIleFromClassPath {

    private static Logger logger;


    public static void main(String[] args) {

        logger.info("Hello, I am info logger.");

        logger.warning("Hello, no date is provided. So, taking the system date as DOJ");

        logger.severe("Error message. Can not connect to the service DateAPI.");

    }

    static {

        // loading the file location.
        String location = LoadLoggingPropertiesFIleFromClassPath.class.getClassLoader().getResource("logging.properties").getFile();
        System.setProperty("java.util.logging.config.file", location);

        logger = Logger.getLogger(LoadLoggingPropertiesFIleFromClassPath.class.getName());
    }
}

Output:
Aug 10, 2020 12:13:47 PM com.javaprogramto.logging.util.LoadLoggingPropertiesFIleFromClassPath main
SEVERE: Error message. Can not connect to the service DateAPI.

4. java.util.logging.logger configuration example with LogManager From Classpath in Java 8.


In the above approach, We are still using the system property and this is not a good practice in the real-time application so it good logging framework to look at the application classpath using LogManager.readConfiguration() method.


Create a util method that will create a logger instance and returns each class wherever we are invoking it.


See the below code is written for the real-time application. It just loads the files classpath and needs to 
provide only once the log file name.

package com.javaprogramto.logging.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.logging.LogManager;
import java.util.logging.Logger;

public class LoadLoggingPropertiesFIleLogManger {

    private static Logger logger = getLogger(LoadLoggingPropertiesFIleLogManger.class);


    public static void main(String[] args) {

        logger.info("Hello, I am info logger.");

        logger.warning("Hello, no date is provided. So, taking the system date as DOJ");

        logger.severe("Error message. Can not connect to the service DateAPI.");

    }

    private static Logger getLogger(Class classObject) {

        InputStream stream = classObject.getClassLoader().getResourceAsStream("logging.properties");
        try {
            LogManager.getLogManager().readConfiguration(stream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Logger.getLogger(LoadLoggingPropertiesFIleLogManger.class.getName());
    }
}

This program produces the output as same as loading from the system property.

5. Conclusion


In this article, You've seen how to load the logging.properties from application classpath and absolute external path using system variable "java.util.logging.config.file".


Finally, Example program to load from classpath using LogManager.readConfiguration() in Java 8.


All examples are shown are over GitHub.





No comments:

Post a Comment

Please do not add any spam links in the comments section.