16 June 2008

Menambahkan Log4J pada Web Aplikasi Java

Adanya log pada sebuah aplikasi web menjadikan kita mudah untuk melacak sebuah proses aliran data yang ada. Log juga menjadi suatu alat bantu bagi kita jika kita ingin melacak error yang terjadi dalam aplikasi web, sehingga kita tahu dimana proses data berhenti jika terjadi error, method atau fungsi apa yang mungkin terjadi salah logika, atau mungkin juga kesalahan-kesalahan lain yang disebabkan oleh kesalahan kita dalam merangkai kode-kode program.

Pada bahasa pemrograman java ada beberapa library yang bisa kita gunakan untuk menambahkan log. Beberapa diantaranya menjadi standar pembuatan aplikasi web. Pada prakteknya log membuat file pencatatan sendiri mengenai proses-proses apa yang memang kita rasa penting untuk kita catat guna melacak suatu proses aliran data. Pencatatan log dalam aplikasi web biasanya dipisahkan dengan masing-masing aplikasi web yang kita buat, dengan tujuan agar kita lebih mudah melacak proses alur data masing-masing aplikasi web.

Pada kesempatan kali ini kita akan mencoba menambahkan log pada aplikasi web kita dengan menggunakan library yang di release oleh
Apache Foundation yaitu Log4J library. Karenanya, kita akan membutuhkan library tersebut, silahkan download library Log4J disini, sementara saya dalam percobaan akan menggunakan library log4j versi 1.2.8. jika anda ingin menggunakan library Log4J terbaru silahkan saja. Saya juga akan memakai Servlet Container Apache Tomcat 5.5 yang biasanya saya pakai untuk membuat web aplikasi.

Yang harus kita sama-sama pahami adalah: ketika pertama kali Tomcat di jalankan maka Tomcat akan membaca semua settingan aplikasi web kita melalui file
web.xml yang ada pada folder WEB-INF di masing-masing folder web aplikasi kita. Dan semua library yang kita gunakan dalam aplikasi web kita harus kita letakkan dalam folder WEB-INF/lib pada masing-masing aplikasi yang kita buat.

Skenario untuk menambahkan log4j pada aplikasi web berdasarkan pemahaman tentang tingkah laku Servlet Container Tomcat di atas adalah: menjalankan suatu servlet yang berisi setting log4j.Oleh karena Tomcat akan membaca file web.xml, maka konfigurasi log4j ini akan kita letakkan di file web.xml. Dan pastinya kita akan membuat suatu servlet yang fungsinya menyeting log4j untuk aplikasi web kita. Karena log4j ini adalah library log yang terpisah dari Tomcat itu maka kita akan meletakkan library log4j ini dalam folder WEB-INF/lib.

Ok langsung saja kita buat servlet yang fungsinya melakukan setting terhadap log4j ini.berikut source code servlet ini. Saya beri nama servlet ini adalah Log4JInitServlet. Servlet ini merupakan extends HttpServlet sehingga kita bisa meng-override beberapa method milik dari class HttpServlet.

package org.mojo.app.web.servlet;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


public class Log4JInitServlet extends HttpServlet{
static Logger logger = Logger.getLogger(Log4JInitServlet.class.getName());

public void init(ServletConfig sc) throws ServletException {
super.init(sc);
ServletContext context = getServletContext();
//find out where this web application is located on machine and print it out
String sPath = context.getRealPath("/");
System.out.println("Application Path :" + sPath);

//finding log4j configuration file on web.xml
String sLogConfigFile = getInitParameter("log4j-init-file");
System.out.println("LogConfig: " + sLogConfigFile);

//configuring Log4J System using PropertyConfigurator Class
PropertyConfigurator.configure(sLogConfigFile);
logger.info("Logger has been initialized...");
}

public void destroy() {
super.destroy();
logger.info("Destroy");
}

protected void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
logger.info("doPost()");
}

protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
logger.info("doGet()");
}
}


Kita akan bahas kode diatas sebelum kita melangkan ke langkah berikutnya.


package org.mojo.app.web.servlet;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


Pada blok ini kita mendeskripsikan package servlet dimana file
Log4JinitServlet ini akan kita letakkan dalam package dan juga kita meng-import kelas-kelas yang kita butuhkan. Kemudian kita akan membuat code untuk mendefinisikan kelas ini dan juga variabel statis logger sebagai Logger yang natinya bisa akan kita gunakan, berikut codenya.


public class Log4JInitServlet extends HttpServlet {
static Logger logger = Logger.getLogger(Log4JInitServlet.class.getName());
........

}


Setelah itu kita langsung membuat sebuah method yang merupakan
overriding method dari HttpServlet yaitu method Init, pada super classnya method ini mempunyai access modifier berupa public, dan mempunyai parameter berupa ServletConfig dan terakhir mempunyai throw ServletException. Berikut blok kode method ini.


public void init(ServletConfig sc) throws ServletException {
.........
}


Dalam method inilah akan kita letakkan settingan konfigurasi log4j untuk aplikasi web kita, coba kita perhatikan potongan baris kodenya.


   super.init(sc);
ServletContext context = getServletContext();
//find out where this web application is located on machine and print it out
String sPath = context.getRealPath("/");
System.out.println("Application Path :" + sPath);


Baris pertama kita memanggil method asli dari asal kelas ini, lalu baris kedua kita mendefinisakan variabel
context yang type data objectnya adalah ServletContext, kemudian pada baris ke empat kita mendefinisikan suatu variable String sPath yang kita isi dengan nilai yang kita ambil dari real-path variabel context yang sudah kita definisikan sebelumnya, untuk kemudian mencetaknya ke atas konsol. Sebenarnya baris ini boleh kita pakai boleh juga tidak, sebab inti dari baris kode ini adalah hanya mengetahui dimana aplikasi web kita terletak.


Ok mari kita perhatikan baris selanjutnya.


  //finding log4j configuration file on web.xml
String sLogConfigFile = getInitParameter("log4j-init-file");
System.out.println("LogConfig: " + sLogConfigFile);

//configuring Log4J System using PropertyConfigurator Class
PropertyConfigurator.configure(sLogConfigFile);
logger.info("Logger has been initialized...");


Pada baris pertama ada komentar yang memberitahukan bahwa kode dibawahnya akan mencari file konfigurasi pada web.xml. Dapat terlihat pada baris kedua kita mendefinisikan sebuah variabel String yang bernama
sLogConfigFile yang di isi oleh nilai yang kita ambil dari parameter servlet yang nanti kita konfigurasi pada file web.xml, nama parameternya adalah “log4j-init-file”. Dalam web.xml nantinya kita akan membuat sebuah baris yang nilainya berisi log4j-init-file, dan dibawahnya nanti kita akan membuat baris ..... dimana titik-titik ini adalah value atau nilai dari nama parameter log4j-init-file.


Pada baris berikutnya kita juga bisa melihat ada komentar disana yang kurang lebih artinya begini “Menkonfigurasu System Log4J menggunakan kelas PropertyConfigurator”. Nah pada kodenya untuk mengkonfigurasi file log4j ini kita cukup memanggil method configure yang dimiliki oleh kelas PropertyConfigurator. Jika telah berhasil dikonfigurasi maka kita tinggal memanggil instance dari library log4j dengan cara memanggil method info dan mengisi paramater method info dengan string “Logger has beed initialized”.


Perlu diperhatikan bahwa jika string ini di cetak dalam file log maka artinya kita telah selesai mengkonfigurasi log untuk aplikasi web kita, sehingga untuk method-method lain yang kita buat, kita hanya cukup memanggil method info info ini saja, demikian halnya dengan kelas-kelas lain yang ingin kita buat. Kita hanya memanggil method info ini saja untuk memasukkan entry-entry pada log yang memang ingin kita buat dengan tidak lupa men-deklarasikan secara static object Logger seperti contoh di atas .

Pada prakteknya nanti log yang akan kita buat mempunya dua log, log yang pertama berisi log alur data biasa dan yang kedua log yang berisi alur data yang error. Untuk memanggil method
error untuk logger cukup dengan mengganti logger.info() dengan logger.error().

Selain itu, dalam file ini kita juga mengoverride tiga method
HttpServlet yaitu : method doPost, doGet, dan method destroy, tapi untuk tiga method ini tidak perlu saya jelaskan lagi sebab tidak terlalu penting dalam permasalah konfigurasi log4j ini. Tiga method ini hanya sebagai optional dari pilihan kita meng-ekstend kelas HttpServlet.

Sampai disini kita telah selesai membuat sebuah servlet yang berisi setting konfigurasi logger
Log4j library ini. Sekarang mari kita lanjutkan dengan membuat file web.xml yang nantinya akan menjadi panduan si Servlet Container Tomcat untuk membaca web aplikasi kita.

Perhatikan kode lengkap web.xml di bawah ini.

Dapat kita lihat pada source code web.xml di atas bahwa ada sebuah servet yang dikonfigurasi dalam aplikasi web kita, servlet itu bernama Log4JInitServlet. Jika kita perhatikan dalam blok ......... ada sebuah kelas yang di panggil disana yaitu kelas Log4JInitServlet yang terletak pada package org.mojo.app.web.servlet, nah servlet yang baru saja selesai kita buat tadi ternyata di panggil disini. Servlet ini mempunyai param name log4j-init-file yang memang tadi kita buat pada servlet, lalu mempunyai param value yang bernilai /java/mojo/web_app/macam-macam/config/macam-macam_log4j.properties. Servlet ini juga akan di jalankan pada pertama kali Tomcat di start ditandai dengan blok 1

Perhatikan baris param value, ada yang harus kita pahami lebih dalam disini yang berkaitan dengan masalah behaviour Tomcat. Jika kita dalam System Windows menginstall Tomcat kita pada folder C:\Web\Tomcat_5.5, maka root Tomcat akan dimulai dari folder Tomcat tersebut, sementara root system akan di mulai dari drive C:\. Nah hubungannya dengan param value ini adalah, jika kita menggunakan caracter “/” pada permulaan nilai pada param-value seperti contoh diatas, maka file macam-macam_log4j.properties kita akan ada pada path: C:\Java\mojo\web_app\macam-macam\config\.Itulah salah satu behaviour tomcat jika kita menggunakan caracter “/ ” pada awal sebuah nilai dari parameter di web.xml maka tomcat akan membacanya dari root system. Bagaimana dengan yang tidak memulainya dengan karakter “/”, maka tomcat akan membacanya dari root dirinya sendiri. Yaitu C:\Web\Tomcat_5.5.


Selanjutnya kita akan membuat sebuah file property nya log4j, dalam membuat file ini kita harus mengikuti API(Application Performace Interface) dari vendor yang mengeluarkan library log 4j ini. Berikut file property log4 j ini.

# For the general syntax of property based configuration files see the
# documentation of org.apache.log4j.PropertyConfigurator.
# The root category uses two appenders called A1 and R. Since no priority is
# specified, the root category assumes the default priority for root
# which is DEBUG in log4j. The root category is the only category that
# has a default priority. All other categories need not be assigned a
# priority in which case they inherit their priority from the
# hierarchy.

#log4j.rootCategory=, R
# Root logger set to DEBUG using the A2 appender defined above.

log4j.rootLogger=, R, E, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%d %5p [%F:%L] - %m%n

# R is the RollingFileAppender that outputs to a rolling log
# file called web_app.log.
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=/java/mojo/web_app/macam-macam/logs/macam-macam.log
log4j.appender.R.Threshold=DEBUG

# Define a pattern layout for the file.
# For more information on conversion characters (i.e. d,p,t,c,l,m,n)
# please see the PatternLayout class of the Log4j API.
log4j.appender.R.layout=org.apache.log4j.PatternLayout

#log4j.appender.R.layout.ConversionPattern=%d [%c{1}] %-5p - %m%n
log4j.appender.R.layout.ConversionPattern=%d [%F:%L] %-5p - %m%n

# Set the max size of the file and the number of backup files
log4j.appender.R.MaxFileSize=2MB
log4j.appender.R.MaxBackupIndex=9

################################## Define Error File Log #########################################
# E is the ErrorFileAppender that outputs to a rolling log
# file called web_err.log.
log4j.appender.E=org.apache.log4j.RollingFileAppender
log4j.appender.E.File=/java/mojo/web_app/macam-macam/logs/macam-macam_err.log
log4j.appender.E.Threshold=ERROR

# Define a pattern layout for the file.
# For more information on conversion characters (i.e. d,p,t,c,l,m,n)
# please see the PatternLayout class of the Log4j API.

log4j.appender.E.layout=org.apache.log4j.PatternLayout
#log4j.appender.E.layout.ConversionPattern=%d [%c{1}] %-5p - %m%n
log4j.appender.E.layout.ConversionPattern=%d [%F:%L] %-5p - %m%n

# Set the max size of the file and the number of backup files
log4j.appender.E.MaxFileSize=100KB
log4j.appender.E.MaxBackupIndex=9


Kita tidak akan membahas satu demi satu isi dari file log4j properties ini. Kita cukup memperhatikan baris log4j.appender.R.File=/java/mojo/web_app/macam-macam/logs/macam-macam.log ini saja, baris ini adalah baris dimana logger nantinya akan membuat logger ditandai dengan nama macam-macam.log. Selain itu kita juga hanya harus memperhatikan baris log4j.appender.E.File=/java/mojo/web_app/macam-macam/logs/macam-macam_err.log. Disinilah logger akan meletakkan semua error log pada aplikasi web kita.

Sebagai petunjuk terakhir adalah tahap
deployment aplikasi kita ini, copy file log4j library anda ke dalam aplikasi web anda dan letakkan di folder WEB-INF/lib, kemudia letakkan kelas Log4JInitServlet ini pada path package yang benar dan terakhir jangan lupa mengkopi file properties log4j nya ke juga kedalam path yang benar sesuai dengan konifgurasi pada file web.xml, jangan lupa juga untuk membuat folder logs dalam path yang benar berdasarkan konfigurasi pada file log4j.properties.

Selesai sudah, pembahasan kita kali ini, selamat mencoba dan jangan lupa feedbacknya ke tulisan ini :D




Semoga Bermanfaat

Menteng, 15 Juni 2008


Josescalia

5 comments:

Anonymous said...

Terimakasih, sangat membantu ...

yayayaya said...

mau nanya, kalo terhubung ke database gmn?

Anonymous said...

kalu terhubung dengan database seperti apa?

JoseScalia said...

Nambahin ke database apa maksudnya...??
Mungkin aplikasi web dengan database gitu..??

Wisnu said...

Terima kasih, sangat membantu saya yang sedang bingung.. :)