Java Hack: How to use Log4j in jar applications

There is no doubt how important is the logs for a production grade application. Operational problems can be avoided and business decisions can be improved by collecting and analyzing adequate logs.

Source: innovationm.com

Recently I’ve been working on a Java project where I had to use the jSMPP library. Two of it’s dependencies are SLF4J and Log4J. Though it can work without then just fine for development, but as I got used to the library the uncool warning messages started to bother me. So I went there to add them in the dependencies. It is needed to mention here SL4J just provides a facade where Log4J does all the heavy lifting.

The first thing I noticed that it’s a bit tricky to configure Log4J. By default it takes its configurations from a log4j.properties file which basically looks like this:

Sample Log4J properties file

My first challenge was to find the sweet spot of where should I put this file. I was reading tutorials and SO answers trying their suggestions finally what worked for me was to put the file in:

out/production/classes/

I think it is also needed to mention that I am using IntelliJ IDEA for my development. I would be much obliged if someone could point me out what was I doing wrong.

Anyway, after it worked out I did some more development and was ready to hand over so I made the .jar of the project and tried to run it and bam!!, same error appeared. What I think is placing the properties file in my specified location was a bit hacky, and may not got included in the jar.

After a bit research , this was my solution. I created a class Log4Jconfigurator which had a configure method. My inspiration was the Log4J’s BasicConfigurator class. I took the idea and made it work with my need. The BasicConfigurator had only the methods to print the logs in the console but I needed to do it both in the console and file. So my configurator looks like this:

You can see that its configure method takes a String logpath which is the file path where I want to write the log. In the line 16 you may set a different level like Info, Warn, Error, Debug etc. Finally I needed to call this from the main method:

String logpath = "/home/jonhdoe/logs/myproject.log";
Log4Jconfigurator.configure(logpath);

After this I can log nicely both in console and file and I can switch between them any moment. You may find it useful too when you have to use Log4J in your projects.

Happy coding.

Started(writing) with poetry, ended up with codes. Have a university degree on Biotechnology. Works and talks about Java, Python, JS. Have philophobia.

Started(writing) with poetry, ended up with codes. Have a university degree on Biotechnology. Works and talks about Java, Python, JS. Have philophobia.