Friday, September 26, 2014

Apache logging services, Apache log4j, Apache commons logging

Apache logging services


"The Apache Logging Services Project creates and maintains open-source software related to the logging of application behavior and released at no charge to the public."


Components:

Apache Log4j 2

Log4j 2 is an upgrade to Log4j that provides significant improvements over its predecessor, Log4j 1.x.

Apache log4php

A versatile logging framework for PHP. Originally a port of Apache log4j to PHP, it has grown to include various PHP specific features.

Apache log4net

A port of the excellent Apache log4j framework to the Microsoft .NET runtime.

Apache chainsaw

A GUI based log viewer. Chainsaw is a companion application to log4j written by members of the log4j development community.

Apache log4j

The original Apache logging framework for Java.

Apache log4cxx

Apache log4cxx is a logging framework for C++ patterned after log4j.

Apache log4j extras

Extras for log4j 1.x, like companions, receivers and more.


How to use Apache log4j 1.x: 

  1. Website:
    https://logging.apache.org/log4j/1.2/

    "With log4j it is possible to enable logging at runtime without modifying the application binary."
    "The target of the log output can be a file, an OutputStream, a java.io.Writer, a remote log4j server, a remote Unix Syslog daemon, or many other output targets."
  2. Read before start:
    https://logging.apache.org/log4j/1.2/manual.html
  3. Download:
    https://logging.apache.org/log4j/1.2/download.html
    http://ftp.tc.edu.tw/pub/Apache/logging/log4j/1.2.17/log4j-1.2.17.zip
    http://ftp.mirror.tw/pub/apache/logging/log4j/1.2.17/log4j-1.2.17.tar.gz
    Linux: "log4j-1.2.17.tar.gz"
    Windows: "log4j-1.2.17.zip"
  4. Import to Eclipse:
    Eclipse -> New Java Project "log4jTest01" -> Next -> Adding Log4j JAR file by "Libraries → Add External JARs" -> Select "log4j-1.2.17.zip" or "log4j-1.2.17.tar.gz" -> Finish.
  5. Create log4j.properties file in project src folder:
      
      # Set root logger level to DEBUG and have appenders A1, A2.
      log4j.rootLogger=DEBUG, A1, A2
    
      # A1 is set to be a ConsoleAppender
      log4j.appender.A1=org.apache.log4j.ConsoleAppender
      log4j.appender.A1.layout=org.apache.log4j.PatternLayout
      log4j.appender.A1.layout.ConversionPattern=[%d{yyyy/MM/dd HH:mm:ss,SSS}][%p][%C-%L] %m%n
    
      # A2 is set to be a DailyRollingFileAppender to path "./log/Log4j.log"
      log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
      log4j.appender.A2.layout=org.apache.log4j.PatternLayout
      log4j.appender.A2.layout.ConversionPattern=[%d{yyyy/MM/dd HH:mm:ss,SSS}][%p][%C-%L] %m%n
      log4j.appender.A2.File=./log/Log4j.log
    
      # Other usage: Enable below line to print only messages of level WARN or above in the package "log4jTest.log4jTest01".
      # log4j.logger.log4jTest.log4jTest01=WARN
    
  6. Create java package "log4jTest" and add source log4jTest01.java with class log4jTest01:
  7.   package log4jTest;
    
      import org.apache.log4j.Level;
      import org.apache.log4j.Logger;  
    
      public class log4jTest01 {
        private static Logger loggerlog4jTest01 = Logger.getLogger(log4jTest01.class);  
    
        public static void main(String[] args) {  
          // Example 1: (TRACE < DEBUG < INFO < WARN < ERROR < FATAL)
          loggerlog4jTest01.info("-------------------------------------------------");
          loggerlog4jTest01.info("Example 1: loggerlog4jTest01 will using Level setting in log4j.properties file");
          loggerlog4jTest01.trace("This is trace message.");
          loggerlog4jTest01.debug("This is debug message.");
          loggerlog4jTest01.info("This is info message.");
          loggerlog4jTest01.warn("This is warn message.");
          loggerlog4jTest01.error("This is error message.");
          loggerlog4jTest01.info("-------------------------------------------------");
    
          // Example 2: (TRACE < DEBUG < INFO < WARN < ERROR < FATAL)
          // Test two logger "com.foo" and "com.foo.Bar"
          loggerlog4jTest01.info("-------------------------------------------------");
          loggerlog4jTest01.info("Example 2: barlogger will inherit debug level from foologger");
          // get a logger instance named "com.foo"
          Logger  foologger = Logger.getLogger("com.foo");
    
          // Now set its level. Normally you do not need to set the
          // level of a logger programmatically. This is usually done
          // in configuration files.
          foologger.setLevel(Level.INFO);
          foologger.info("foologger setLevel to Level.INFO");
    
          Logger barlogger = Logger.getLogger("com.foo.Bar");
    
          // This request is enabled, because WARN >= INFO.
          foologger.warn("foologger Low fuel level.");
    
          // This request is disabled, because DEBUG < INFO.
          foologger.debug("foologger Starting search for nearest gas station.");
    
          // The logger instance barlogger, named "com.foo.Bar",
          // will inherit its level from the logger named
          // "com.foo" Thus, the following request is enabled
          // because INFO >= INFO.
          barlogger.info("barlogger Located nearest gas station.");
    
          // This request is disabled, because DEBUG < INFO.
          barlogger.debug("barlogger Exiting gas station search");
          loggerlog4jTest01.info("-------------------------------------------------");
        }  
      }
    
  8. Build and run, you will see below output in Eclipse Console window:
      [2014/09/28 17:56:35,583][INFO][log4jTest.log4jTest01-11] -------------------------------------------------
      [2014/09/28 17:56:35,588][INFO][log4jTest.log4jTest01-12] Example 1: loggerlog4jTest01 will using Level setting in log4j.properties file
      [2014/09/28 17:56:35,589][DEBUG][log4jTest.log4jTest01-14] This is debug message.
      [2014/09/28 17:56:35,590][INFO][log4jTest.log4jTest01-15] This is info message.
      [2014/09/28 17:56:35,590][WARN][log4jTest.log4jTest01-16] This is warn message.
      [2014/09/28 17:56:35,591][ERROR][log4jTest.log4jTest01-17] This is error message.
      [2014/09/28 17:56:35,591][INFO][log4jTest.log4jTest01-18] -------------------------------------------------
      [2014/09/28 17:56:35,592][INFO][log4jTest.log4jTest01-22] -------------------------------------------------
      [2014/09/28 17:56:35,595][INFO][log4jTest.log4jTest01-23] Example 2: barlogger will inherit debug level from foologger
      [2014/09/28 17:56:35,596][INFO][log4jTest.log4jTest01-31] foologger setLevel to Level.INFO
      [2014/09/28 17:56:35,597][WARN][log4jTest.log4jTest01-36] foologger Low fuel level.
      [2014/09/28 17:56:35,597][INFO][log4jTest.log4jTest01-45] barlogger Located nearest gas station.
      [2014/09/28 17:56:35,598][INFO][log4jTest.log4jTest01-49] -------------------------------------------------
    

Apache commons logging


"When writing a library it is very useful to log information. However there are many logging implementations out there, and a library cannot impose the use of a particular one on the overall application that the library is a part of."

"The Logging package is an ultra-thin bridge between different logging implementations. A library that uses the commons-logging API can be used with any logging implementation at runtime. Commons-logging comes with support for a number of popular logging implementations, and writing adapters for others is a reasonably simple task."

"Applications (rather than libraries) may also choose to use commons-logging."

How to use Apache commons logging: 


  1. Download:
    http://commons.apache.org/proper/commons-logging/download_logging.cgi
    http://ftp.twaren.net/Unix/Web/apache//commons/logging/binaries/commons-logging-1.2-bin.zip
  2. Import to both "log4j-1.2.17.jar" and "commons-logging-1.2.jar" to Eclipse.
  3. Create log4j.properties file(same as previous one) in project src folder.
  4. HelloWorld.java:
      package demo.JclTest;
    
      import org.apache.commons.logging.Log;
      import org.apache.commons.logging.LogFactory;
       
      public class HelloWorld {
        static Log logger = LogFactory.getLog(HelloWorld.class);
    
        public static void main(String[] args) {
          logger.info("Hello World");
          
          // Example 1: (TRACE < DEBUG < INFO < WARN < ERROR < FATAL)
          logger.info("-------------------------------------------------");
          logger.info("Example 1: logger will using Level setting in log4j.properties file");
          logger.trace("This is trace message.");
          logger.debug("This is debug message.");
          logger.info("This is info message.");
          logger.warn("This is warn message.");
          logger.error("This is error message.");
          logger.info("-------------------------------------------------");
        }
      }
    
  5. Build and run:
      [2014/09/28 18:29:11,645][INFO][demo.JclTest.HelloWorld-10] Hello World
      [2014/09/28 18:29:11,650][INFO][demo.JclTest.HelloWorld-13] -------------------------------------------------
      [2014/09/28 18:29:11,650][INFO][demo.JclTest.HelloWorld-14] Example 1: logger will using Level setting in log4j.properties file
      [2014/09/28 18:29:11,651][DEBUG][demo.JclTest.HelloWorld-16] This is debug message.
      [2014/09/28 18:29:11,652][INFO][demo.JclTest.HelloWorld-17] This is info message.
      [2014/09/28 18:29:11,652][WARN][demo.JclTest.HelloWorld-18] This is warn message.
      [2014/09/28 18:29:11,653][ERROR][demo.JclTest.HelloWorld-19] This is error message.
      [2014/09/28 18:29:11,653][INFO][demo.JclTest.HelloWorld-20] -------------------------------------------------
    



No comments:

Post a Comment