Why Operate Log4j Logging Vs System.Out.Println Inwards Java
Printing messages to the console is an integral business office of development, testing as well as debugging a Java program. If y'all are working on a Server side application, where y'all tin non run across what's going on within the server, your alone visibility tool is a log file; without logs, y'all tin non do whatever debugging or run across what's going on within your application. Though, Java has pretty handy System.out.println() methods to impress something on console, which tin also hold out routed to log file but non sufficient for a real-world Java application. If y'all are running a Java plan inwards Linux or whatever UNIX based system, Log4j or SLF4j or whatever other logging framework offers a lot to a greater extent than features, flexibility, as well as improvement on message quality, which is non possible using the System.out.println() statement.
I strongly discourage using System.out.println() or System.err.println() methods for printing anything inwards production character code, its exactly non acceptable, as well as y'all volition larn why y'all should prefer to exercise Log4j over System.out.println() inwards this post.
By the way, if y'all are using modern IDE similar Eclipse or Netbeans, y'all may acquire alert land using System.out.println() for logging purpose, which is good, otherwise, y'all may terminate upwardly amongst a scenario where about messages are going to log file land other going somewhere else, likely on a file where console is redirected.
It's also a best exercise to exercise Logging framework land coding inwards Java, fifty-fifty books similar Clean Code also advise learning Log4j for logging.
Anyway, hither are about of the reasons, which I intend are plenty to halt y'all using System.out.println() statements inwards production code:
1) Any logging framework including Log4j, SL4J, logback, as well as java.util.logger allows y'all to log debugging information amongst a log level, later on y'all tin exercise that marking equally filtering criteria, i.e. y'all tin disable message belongs to ane item log marking e.g. y'all would hold out to a greater extent than concerned to run across WARN messages than DEBUG messages inwards production.
2) The instant point, which is related to the previous ane is that logging framework allows y'all to suppress message from about other log level, for example, y'all tin run your application inwards DEBUG trend inwards the show environment, but on ERROR trend inwards a production environment. This volition non alone generates fewer logs but also improves the functioning of your application because of less logging, run across 10 tips on logging inwards Java to larn to a greater extent than close this.
This is non possible amongst System.out.println() statements which tin non hold out controlled past times whatever configuration or dynamically at runtime using JMX or whatever watchdog facility.
On the other hand, y'all tin modify the log marking for log4j based logger without restarting your application past times using a watchdog thread, which monitors a place for updated log4j.xml, the configuration file for Apache Log4j. The java.util.Logger also allows y'all to modify logging marking using JMX without restarting the server.
3) By using a Logging framework, y'all tin gain amend outputs as well as metadata, which volition aid during troubleshooting as well as debug. Most logging framework e.g. Log4j allows y'all to impress formatted output past times specifying a formatting designing past times using PatterLayout, which tin include a timestamp, refer of the class, the Thread which is executing code etc.
All of this information tin hold out actually useful land debugging concurrent applications where the output from multiple threads is overlapping. You don't acquire this facilities when y'all exercise the System.out.println() statements for logging messages. What more, even Joshua Bloch has also suggested using a properly logging facility e.g. java.util.Logger for logging inwards his classic mass Effective Java, ane of the must-read books for experienced Java programmers.
Using System.out or System.err rather than a dedicated logging facility makes it hard to monitor the deportment of the program.
Example 1: The commencement Java plan that a developer learns to write frequently looks similar this:
While most programmers acquire on to larn many nuances as well as subtleties close Java, a surprising release hang on to this commencement lesson as well as never surrender on writing messages to criterion output using System.out.println() statement. Well, this is Ok if y'all are writing pocket-size show programs but it for certain non correct if y'all coding on a production organisation alive amongst millions of users or trades.
Logging also affects functioning inwards a big way, I possess got seen a alive event where back upwardly squad left the production organisation on DEBUG marking alone to detect the latency shoots upwardly past times 500 ms as well as users complaining close delayed execution.
That's all close why a Java programmer should exercise a Logging framework over System.out.println() tilt inwards production code. As I said, it's perfectly Ok if y'all are writing show programs as well as pocket-size application but it's non Ok inwards your real-world Java application. You mightiness know that y'all tin also exercise Log4j without XML configuration or belongings files , if that volition encourage y'all to exercise it over print() statements. Though, formatted output amongst metadata, controlling log marking at runtime are about of the features y'all for certain don't desire to ignore.
Further Learning
Complete Java Masterclass
10 Java Concurrency Best Practices, every Java developer shoudl follow.
I strongly discourage using System.out.println() or System.err.println() methods for printing anything inwards production character code, its exactly non acceptable, as well as y'all volition larn why y'all should prefer to exercise Log4j over System.out.println() inwards this post.
By the way, if y'all are using modern IDE similar Eclipse or Netbeans, y'all may acquire alert land using System.out.println() for logging purpose, which is good, otherwise, y'all may terminate upwardly amongst a scenario where about messages are going to log file land other going somewhere else, likely on a file where console is redirected.
It's also a best exercise to exercise Logging framework land coding inwards Java, fifty-fifty books similar Clean Code also advise learning Log4j for logging.
Why prefer Log4j over System.out.println
Many Java programmers possess got their ain argue for using a logging framework similar Log4j, java.util.Logger, SL4j or fifty-fifty Apache Commons logging, but they all are amend than using the System.out.println(). Though my advice is to prefer SLF4j over Log4j for logging inwards Java equally discussed inwards that article.Anyway, hither are about of the reasons, which I intend are plenty to halt y'all using System.out.println() statements inwards production code:
1) Any logging framework including Log4j, SL4J, logback, as well as java.util.logger allows y'all to log debugging information amongst a log level, later on y'all tin exercise that marking equally filtering criteria, i.e. y'all tin disable message belongs to ane item log marking e.g. y'all would hold out to a greater extent than concerned to run across WARN messages than DEBUG messages inwards production.
2) The instant point, which is related to the previous ane is that logging framework allows y'all to suppress message from about other log level, for example, y'all tin run your application inwards DEBUG trend inwards the show environment, but on ERROR trend inwards a production environment. This volition non alone generates fewer logs but also improves the functioning of your application because of less logging, run across 10 tips on logging inwards Java to larn to a greater extent than close this.
This is non possible amongst System.out.println() statements which tin non hold out controlled past times whatever configuration or dynamically at runtime using JMX or whatever watchdog facility.
On the other hand, y'all tin modify the log marking for log4j based logger without restarting your application past times using a watchdog thread, which monitors a place for updated log4j.xml, the configuration file for Apache Log4j. The java.util.Logger also allows y'all to modify logging marking using JMX without restarting the server.
3) By using a Logging framework, y'all tin gain amend outputs as well as metadata, which volition aid during troubleshooting as well as debug. Most logging framework e.g. Log4j allows y'all to impress formatted output past times specifying a formatting designing past times using PatterLayout, which tin include a timestamp, refer of the class, the Thread which is executing code etc.
All of this information tin hold out actually useful land debugging concurrent applications where the output from multiple threads is overlapping. You don't acquire this facilities when y'all exercise the System.out.println() statements for logging messages. What more, even Joshua Bloch has also suggested using a properly logging facility e.g. java.util.Logger for logging inwards his classic mass Effective Java, ane of the must-read books for experienced Java programmers.
Using System.out or System.err rather than a dedicated logging facility makes it hard to monitor the deportment of the program.
Example 1: The commencement Java plan that a developer learns to write frequently looks similar this:
public class MyClass public static void main(String[] args) { System.out.println("hello world"); } }
While most programmers acquire on to larn many nuances as well as subtleties close Java, a surprising release hang on to this commencement lesson as well as never surrender on writing messages to criterion output using System.out.println() statement. Well, this is Ok if y'all are writing pocket-size show programs but it for certain non correct if y'all coding on a production organisation alive amongst millions of users or trades.
Logging also affects functioning inwards a big way, I possess got seen a alive event where back upwardly squad left the production organisation on DEBUG marking alone to detect the latency shoots upwardly past times 500 ms as well as users complaining close delayed execution.
That's all close why a Java programmer should exercise a Logging framework over System.out.println() tilt inwards production code. As I said, it's perfectly Ok if y'all are writing show programs as well as pocket-size application but it's non Ok inwards your real-world Java application. You mightiness know that y'all tin also exercise Log4j without XML configuration or belongings files , if that volition encourage y'all to exercise it over print() statements. Though, formatted output amongst metadata, controlling log marking at runtime are about of the features y'all for certain don't desire to ignore.
Further Learning
Complete Java Masterclass
10 Java Concurrency Best Practices, every Java developer shoudl follow.
0 Response to "Why Operate Log4j Logging Vs System.Out.Println Inwards Java"
Post a Comment