Loggable
A simple log4j meta-library
Loggable is a Java library to be used in conjunction with the Apache log4j standard logging library.
Its main goal is semplifying the logging process throughout the application, thus reducing the usual declarations overhead due to the log4j library.
Example
A standard call to the log4j library is written this way:
[java][RAW]
package com.marzapower.test;
import org.apache.log4j.Logger;
public class Log4jCaller {
private static final Logger logger = Logger.getLogger(Log4jCaller.class);
public static void main(String… args) {
logger.debug("A simple log call");
}
}
[/RAW][/java]
The Loggable meta-library requires a lighter approach:
[java][RAW]
package com.marzapower.test;
import com.marzapower.loggable.*;
@Loggable
public class LoggableCaller {
public static void main(String… args) {
Log.get().debug("A simple log call");
}
}
[/RAW][/java]
This definition will have the same effect at runtime. A still valid approach is the following:
[java][RAW]
package com.marzapower.test;
import com.marzapower.loggable.*;
public class RootLoggerCaller {
public static void main(String… args) {
Log.get().debug("A simple log call");
}
}
[/RAW][/java]
where the @Loggable annotation is missing. This implementation would be equivalent to the first example, if we changed the logger definition to Logger.getRootLogger() instead of Logger.getLogger(Log4jLogger.class).
How does it work
The Loggable meta-library uses two main elements: the @Loggable annotation and the Log class. The first drives the logging logic of our classes, while the latter is a centralized controller that each class has to call in a static way. While, using only the base log4j library, each class had to define a private org.apache.log4j.Logger instance, and then had to invoke methods on this instance, now each class must be annoted with the @Loggable annotation and must call the Log class directly for logging.
We can increase the ease of implementation of the logging architecture doing the following:
- Design an appropriate log4j configuration, so that the root logger can be used equally by each class
- Write down the code of the application classes, without using any additional parameter or annotation or private logger instance
- Within each class, call Log.get() to retrieve the Logger instance to be used directly.
What will happen is that each class, using this approach, will log using the log4j root logger. We can easily convert this code:
[java][RAW]
package com.marzapower.test;
import org.apache.log4j.Logger;
public class Log4jCaller1 {
private static final Logger logger = Logger.getRootLogger();
public void log() {
logger.debug("A simple log call");
}
}
final class Log4jCaller2 {
private static final Logger logger = Logger.getRootLogger();
public void log() {
logger.debug("A simple log call");
}
}
final class Log4jCaller3 {
private static final Logger logger = Logger.getRootLogger();
public void log() {
logger.debug("A simple log call");
}
}
[/RAW][/java]
into this:
[java][RAW]
package com.marzapower.test;
import com.marzapower.loggable.Log;
public class LoggableCaller1 {
public void log() {
Log.get().debug("A simple log call");
}
}
final class LoggableCaller2 {
public void log() {
Log.get().debug("A simple log call");
}
}
final class LoggableCaller3 {
public void log() {
Log.get().debug("A simple log call");
}
}
[/RAW][/java]
Speed up development time
This meta-library will surely speed up development time. This is true because we no longer have to worry about useless definitions. We can insert that Log.get() call everywhere with no additional effort, and every logging call will succeed. By default in fact, every class can at least log through the root logger.
So, we do not have to worry about the definition of the local logger instance, neither have to worry about deleting this instance when we erase every logging call from our class. If we want our class to log into its dedicated logger, we just have to add the short “@Loggable” annotation before the class definition. If we want to modify the logger for that class, we will just change some parameters passed to the annotation.
A more complex example
This is a more complex example:
[java][RAW]
package com.marzapower.test;
import com.marzapower.loggable.*;
import com.marzapower.loggable.Loggable.LogLevel;
@Loggable(clazz = MyOtherClass.class, logLevel = LogLevel.ERROR)
public class LoggableComplexCaller {
public void log() {
Log.get().debug("This will never be logged");
Log.get().error("But this surely will!");
}
}
@Loggable(loggerName = "myLoggable")
final class MyLoggableCaller {
public void log() {
Log.get().debug(
"A simple log call, " +
"using the myLoggable " +
"logger instance");
}
}
@Loggable(exclude = true)
final class LoggableSilentCaller {
public void log() {
Log.get().debug("This will never be logged");
}
}
[/RAW][/java]
The following will happen:
- LoggableComplexCaller will log using the logger instance dedicated to the MyLogger class (the equivalent of Logger.getLogger(MyOtherClass.class)), and only messages whose level is ERROR or higher will be logged
- MyLoggableCaller will log using the log4j logger named “myLoggable“, if present in the log4j configuration files
- LoggableSilentCaller will never log, since Log.get() will return a silent logger for this class.
Additional info
You can find a detailed introduction and explanation of the Loggable meta-library in these two posts:
Download
All the source code and compiled packages for the Loggable meta-library are hosted on github. Please follow this link to the main project page
Changelog
v. 1.0.3
- FIX: A bug in the LoggerContainer class caused an endless loop when asking for a void logger or the root logger
v. 1.0.2
- FIX: A bug in the LoggerContainer class caused a NullPointerException under certain (rare) circumstances
v. 1.0.1
- FIX: A bug in the LoggerContainer class caused a stack overflow when calling Log.get()
v. 1.0
- First official release
Credits and copyright
The Loggable meta-library is released under the GNU Lesser General Public License v. 3.
An outstanding share! I’ve just forwarded this onto a colleague who was doing a little homework on this. And he in fact ordered me breakfast simply because I stumbled upon it for him… lol. So allow me to reword this…. Thanks for the meal!! But yeah, thanx for spending time to talk about this subject here on your web site.
This web site really has all of the info I wanted concerning this subject and didn’t know who to ask.
Hi, I do believe this is an excellent site. I stumbledupon it 😉 I may come back once again since I bookmarked it. Money and freedom is the greatest way to change, may you be rich and continue to help other people.
It’s difficult to find knowledgeable people on this topic, however, you sound like you know what you’re talking about! Thanks
This site was… how do you say it? Relevant!! Finally I have found something which helped me. Thanks a lot!
Hey! Quick question that’s totally off topic. Do you know how to make your site mobile friendly?
My blog looks weird when viewing from my iphone4.
I’m trying to find a theme or plugin that might be able to fix this issue.
If you have any recommendations, please share. Appreciate it!
Excellent blog here! Also your web site loads up very fast!
What web host are you using? Can I get your affiliate link to
your host? I wish my website loaded up as quickly as yours
lol
Wow that was odd. I just wrote an really long comment but
after I clicked submit my comment didn’t appear.
Grrrr… well I’m not writing all that over again. Anyhow, just wanted to say wonderful blog!
Para Bet365 permainan kasino dealer hidup termasuk Hidup Blackjack, Roulette Live Hidup Sic Bo dan Live Baccarat.
Prosesnya singkat karena mengutamakan efisiensi waktu dan tak ada
waktu yang terbuang selama menjalani prosedur pendaftaran di layanan ini, bahkan kelengkapan data dan persyaratan lainnya cenderung ringkas, termasuk setoran deposit.
Sebuah situs yang aman tentu bisa dilihat dari tampilan memadai artinya dengan adanya pencantuman data resmi pengelola yang bisa dijadikan tolak ukur ketika anda akan bergabung dengan sebuah
layanan. ION Casino mempunyai lebih dari 1000 jenis video game slot mesin yang bisa anda
mainkan. Dalam permainan judi slot anda perlu memahami beberapa pengertian dan penjelasannya dimana game Slot
artinya Jumlah roll atau kolom yang terdapat dalam mesin slot dan pada jenis permainan ini umumnya disajikan 3 atau 5 roll slot.
Adapun 3 pilihan kelas dalam bermain judi tembak ikan seperti Beginner, Superior dan Emperior terletak pada banyaknya peluru.
Semakin banyaknya kapasitas peluru yang dimainkan tentu semakin besar juga jumlah jackpot yang bisa diperoleh.