Logging in java Part-1

Logging is one of the most important part of an application development. A well logging enabled application not only keeps track of the application flow but it also helps in debugging. As application grows logging even becomes more important because it helps in finding a bug which seldom comes on production. There may be thousands of logging requests generated per second depending upon the application size in that case logging should not hamper application performance. Apart from performance there are other things like configuration, abstraction, encoders, appenders and filters which should be taken into consideration while choosing a logging framework. 
In java there are 5 commonly used logging frameworks:
  1. Java logging framework (JUL)
  2. Jakarta Commons logging (JCL)
  3. Simple logging facade for java (SLF4J)
  4. Log4j
  5. Logback
Log4j is most widely used logging framework in conjunction with JCL or SLF4j. In this article I'll start with basic comparasion between log4j and logback later on I'll go in detail about how to configure logback in your project. JCL and slf4j are abstract logging framework mostly used by library developers while other 3 libraries do actual logging. Earlier jcl was used by most of the libraries but since it has runtime class loading problems which often result in annoying exceptions so you will see library developers are upgrading to slf4j based logging which not only overcomes jcl class loading problem but it also provides other useful functionality like support for arguments in logging statement.  Slf4j can be plugged with most of the logging frameworks like jcl, log4j, logback and jul.

Log4j File Appender: Following code logs in a file test-log4j.log as well as console.

   
      
         
      
   
   
      
      
      
      
         
      
   
   
      
      
      
   

Logback File Appender: Following code logs in a file test-logback.log as well as console.

   
     
       %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
     
   
   
      /home/mukesh/logs/testing/test-logback.log
      
         %date %level [%thread] %logger{10} %msg%n
      
   
   
      
      
   


Logback vs Log4j File Appender Performance Graph

Above graph represents the performance of logback and log4j for file appender using single logging statement. Y-axis represents number of logging statements and X-axis represents number of threads. Both programs were run for same time for each thread set on the same machine. In this graph clearly logback has an advantage because it takes less time as compared to log4j in logging a statement.

Log4j JDBC Appender: Following code logs in a mysql table log4jTable as well as console.

   
      
         
      
   
   
      
      
      
      
      
   
   
      
      
      
   


Logback JDBC Appender: Following code logs in a mysql table logging_event as well as console.

   
      
         %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
      
   
   
      
         
            com.mysql.jdbc.Driver
            jdbc:mysql://localhost:3306/logback
            root
            
         
      
      
   
   
      
      
   


Logback vs Log4j JDBC Appender Performance Graph

Above graph represents the performance of logback and log4j for jdbc appender using single logging statement. Y-axis represents number of logging statements and X-axis represents number of threads. Both programs were run for same time for each thread set on the same machine. In this graph clearly performace of logback is miles ahead of log4j primarily because logback uses threadpooling and it has standard tables for logging, script is packaged with logback distribution. There is no out of box configuration for thread pool in log4j.

In the next part I'll discuss about how to configure slf4j and logback in a project. Stay tuned ...
Read More

Install subversion 1.7.x in ubuntu and mint

Ubuntu official software repository doesn't have subversion 1.7.x which is required by subclipse 1.8.x.
But you can download all relevant packages from debian repository and install it manually.
Packages required for 64-bit machine are listed below, for 32-bit machine replace amd64 with i386.

1. subversion_1.7.5-1_amd64.deb
2. libsvn1_1.7.5-1_amd64.deb
3. libsvn-java_1.7.5-1_amd64.deb
4. libaprutil1_1.4.1-3_amd64.deb
5. libserf1_1.1.0-2_amd64.deb

Download Link: http://packages.debian.org/ko/sid/subversion
You need to search package name in the search box and then download all packages listed above. Download link are at the end of page with files listed for different architecture machine for example in the below image mouse pointer is located at the file for 64-bit machine.


Read More

Generate SSL Certificate and add it to JVM and Tomcat

# Steps to generate a certificate file in linux.
# Keep a common password whenever asked during the process. Commonly used password is "changeit".
# Minimum requirement - openssl and jdk must be installed.
# In this example domain name used for demonstration is "localhost".

# Run these commands in the same order as written.

# Generate a key
 

openssl genrsa -des3 -out localhost.key 1024 

# Generate a local certificate sigining request.
# In this step some information related to company will be asked to enter, keep in mind that "common name" must be the domain name.
 

openssl req -new -key localhost.key -out localhost.csr 

# Generate a certificate from csr file, it has validity of 365 days.  
openssl x509 -req -days 365 -in localhost.csr -signkey localhost.key -out localhost.crt
 

# Generate a pem file  
openssl pkcs12 -export -in localhost.crt -inkey localhost.key -out localhost.pem 

# Generate a keystore file which will be placed in tomcat. 
sudo keytool -importkeystore -deststorepass changeit -destkeypass changeit -destkeystore localhost.keystore -srckeystore localhost.pem -srcstoretype PKCS12 -srcstorepass changeit -srcalias 1 -destalias localhost 

# Add certificate in jvm 
sudo keytool -import -alias localhost -file localhost.crt -keystore /usr/lib/jvm/jdk1.6.0_33/jre/lib/security/cacerts 

# Modification of server.xml in tomcat 
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="/home/mukesh/Documents/keystore/localhost.keystore" keystorePass="changeit"/>
 

 # File type explanation
  1. .csr file - This is a Certificate Signing Request. Some applications can generate these for submission to certificate-authorities. It includes some/all of the key details of the requested certificate such as subject, organization, state, whatnot. These get signed by the CA and a certificate is returned. The returned certificate is the public certificate, which itself can be in a couple of formats.
  2. .pem file -  This is the public-key of a specific certificate in X.509 format. This is also the format used for Certificate Authority certificates.
  3. .key file - This is the private-key of a specific certificate.
  4. .pkcs12 .pfx .p12 file - A passworded container format that contains both public and private certificate pairs. It can be broekn it into .key and .pem files.
  5. .cert, .cer, .crt file - A .pem file with a different extension in X.509 format. This extension is recognized by Windows Explorer as a certificate, which .pem is not.
Read More

Remove grid lines completely from excel jasperreports

Jasperreports version - 4.5.0
Apache poi version - 3.7

Jasperreports uses apache poi for xls report generation but for xlsx report generation it uses its own ooxml implementation so you have to modify both of these libraries to remove excel grid lines completely.

For XLS - Line 744, File location - poi-3.7-src/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
   HSSFSheet sheet = new HSSFSheet(this);
+ sheet.setDisplayGridlines(false);


For XLSX - Line 97, File location - jasperreports-4.5.0/src/net/sf/jasperreports/engine/export/ooxml/XlsxSheetHelper.java
- write("<sheetPr><outlinePr summaryBelow=\"0\"/></sheetPr><dimension ref=\"A1\"/><sheetViews><sheetView workbookViewId=\"0\"");
+ write("<sheetPr><outlinePr summaryBelow=\"0\"/></sheetPr><dimension ref=\"A1\"/><sheetViews><sheetView workbookViewId=\"0\" showGridLines=\"false\"");
Read More

Report design not valid

If content of a section doesn't fit in a page then following exception is thrown by jasperreports design validator. There are many ways to get rid of this exception.

  1. Increase your report's page height. But if you are not sure about subreport's height then this option might not work for you.
  2. If you are using dynamic reports (Wrapper around jasperreports) and suppose you are adding subreport in summary section then specifying summary split type to IMMEDIATE will solve the problem.
JasperReportBuilder reportBuilder = report().setSummarySplitType(SplitType.IMMEDIATE);

net.sf.dynamicreports.jasper.transformation.ComponentTransform$SubreportExpression evaluate
SEVERE: Error encountered while creating subreport design
net.sf.jasperreports.engine.design.JRValidationException: Report design not valid :
1. The summary section and the margins do not fit the page height.
at net.sf.jasperreports.engine.design.JRAbstractCompiler.verifyDesign(JRAbstractCompiler.java:258)
at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:140)
at net.sf.jasperreports.engine.JasperCompileManager.compileReport(JasperCompileManager.java:212)
at net.sf.dynamicreports.jasper.transformation.ComponentTransform$SubreportExpression.evaluate(ComponentTransform.java:473)
at net.sf.dynamicreports.jasper.base.JasperScriptlet.getValue(JasperScriptlet.java:56)
at net.sf.dynamicreports.jasper.base.JasperCustomValues.getValue(JasperCustomValues.java:112)
at Report_1335085550494_722509.evaluate(Report_1335085550494_722509:202)
at net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:190)
at net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:591)
at net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:559)
at net.sf.jasperreports.engine.fill.JRFillElement.evaluateExpression(JRFillElement.java:876)
at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateReport(JRFillSubreport.java:284)
at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateSubreport(JRFillSubreport.java:347)
at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluate(JRFillSubreport.java:275)
at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:257)
at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:473)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillSummaryNoLastFooterSamePage(JRVerticalFiller.java:1067)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillSummary(JRVerticalFiller.java:1032)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportEnd(JRVerticalFiller.java:296)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:135)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:836)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:765)
at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:84)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:624)
Read More