<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.scott5.org/index.php?action=history&amp;feed=atom&amp;title=Log4j</id>
	<title>Log4j - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.scott5.org/index.php?action=history&amp;feed=atom&amp;title=Log4j"/>
	<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Log4j&amp;action=history"/>
	<updated>2026-04-12T19:10:08Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Log4j&amp;diff=428&amp;oldid=prev</id>
		<title>Scott at 00:21, 4 February 2011</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Log4j&amp;diff=428&amp;oldid=prev"/>
		<updated>2011-02-04T00:21:59Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{lowercase title}}&lt;br /&gt;
== References ==&lt;br /&gt;
* http://www.developer.com/open/article.php/10930_3097221_1&lt;br /&gt;
* http://logging.apache.org/log4j/docs/manual.html&lt;br /&gt;
* Sun&amp;#039;s alternative logging infrastructure for jdk 1.4: http://java.sun.com/j2se/1.4.2/docs/guide/util/logging/&lt;br /&gt;
* Email error messages with SMTPAppender: http://www.onjava.com/pub/a/onjava/2004/09/29/smtp-logging.html&lt;br /&gt;
* http://java2.5341.com/msg/32707.html&lt;br /&gt;
* http://logging.apache.org/log4j/docs/api/&lt;br /&gt;
* PatternLayout specs: http://logging.apache.org/log4j/docs/api/org/apache/log4j/PatternLayout.html&lt;br /&gt;
&lt;br /&gt;
== Theory ==&lt;br /&gt;
* Logger - the object that takes messages for logging&lt;br /&gt;
* Appender - the object that outputs messages to some medium &lt;br /&gt;
* Layout - controls the format of the output message &lt;br /&gt;
&lt;br /&gt;
== Logging Levels ==&lt;br /&gt;
DEBUG &amp;lt; INFO &amp;lt; WARN &amp;lt; ERROR &amp;lt; FATAL&lt;br /&gt;
&lt;br /&gt;
If a given logger has level WARN, the an INFO logging request will not be processed. &lt;br /&gt;
&lt;br /&gt;
== Hierarchy and Inheritance ==&lt;br /&gt;
There is always a root logger. Each logger is associated with some node in the package hierarchy, and its log level is either explicitly assigned or inherited from higher up in the hierarchy. &lt;br /&gt;
Example: During coding, my root log level is DEBUG. I&amp;#039;m done working on the dc.util package and want to focus on classes in dc and dc.db. I might stifle excessive log messages from the dc.util classes by creating a dc.util logger (in the properties file) and assigning it a level of WARNING or ERROR. &lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
* Make sure log4j.jar is on your classpath. Get it from here:&lt;br /&gt;
&lt;br /&gt;
http://logging.apache.org/log4j/docs/download.html&lt;br /&gt;
&lt;br /&gt;
==Properties File==&lt;br /&gt;
Create a log4j.properties file:&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# set root logger level to ERROR and give it an appender&lt;br /&gt;
log4j.rootLogger = ERROR, RootAppender&lt;br /&gt;
log4j.appender.RootAppender = org.apache.log4j.ConsoleAppender&lt;br /&gt;
log4j.appender.RootAppender.layout = org.apache.log4j.PatternLayout&lt;br /&gt;
log4j.appender.RootAppender.layout.ConversionPattern = %d{HH:mm:ss} %-5p [%c{1}] %m%n&lt;br /&gt;
&lt;br /&gt;
# set the top level org logger to WARN&lt;br /&gt;
log4j.logger.org = WARN&lt;br /&gt;
&lt;br /&gt;
# set the top level Mirc logger to INFO&lt;br /&gt;
log4j.logger.org.rsna = INFO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# set root logger level to ERROR and give it an appender&lt;br /&gt;
log4j.rootLogger = ERROR, RootAppender&lt;br /&gt;
log4j.appender.RootAppender = org.apache.log4j.ConsoleAppender&lt;br /&gt;
log4j.appender.RootAppender.layout = org.apache.log4j.PatternLayout&lt;br /&gt;
log4j.appender.RootAppender.layout.ConversionPattern = %d{HH:mm:ss} %-5p [%c{1}] %m%n&lt;br /&gt;
&lt;br /&gt;
# set the top level org logger to WARN&lt;br /&gt;
log4j.logger.org = WARN&lt;br /&gt;
&lt;br /&gt;
# set the top level Mirc logger to INFO&lt;br /&gt;
log4j.logger.org.rsna = INFO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Other kinds of Appenders===&lt;br /&gt;
* FileAppender&lt;br /&gt;
* DailyRollingFileAppender&lt;br /&gt;
* RollingFileAppender&lt;br /&gt;
* SMTPAppender seems to depend on javax.Mail, which seems to be part of J2EE.&lt;br /&gt;
&lt;br /&gt;
==Load in main()==&lt;br /&gt;
In the main() method, load the log4j properties like this:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
initializeLog4J(&amp;quot;config/log4j.properties&amp;quot;);&lt;br /&gt;
...&lt;br /&gt;
/**&lt;br /&gt;
* Function to configure Log4J from the properties file.&lt;br /&gt;
*/&lt;br /&gt;
private static void initializeLog4J(String filename) {&lt;br /&gt;
  File file = new File(filename);&lt;br /&gt;
  if (file.exists()) {&lt;br /&gt;
    PropertyConfigurator.configure(filename);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Logging==&lt;br /&gt;
In each class that will include logging statements: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Import necessary log4j API classes&lt;br /&gt;
import org.apache.log4j.*;&lt;br /&gt;
...&lt;br /&gt;
private static final Logger logger = Logger.getLogger(DicomObjectProcessor.class);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use log statements wherever it makes sense: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
logger.debug();&lt;br /&gt;
logger.info();&lt;br /&gt;
logger.warn();&lt;br /&gt;
logger.error();&lt;br /&gt;
logger.fatal();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
</feed>