Dalam pembuatan aplikasi untuk keperluan ‘production’, kita harus membiasakan untuk melakukan logging. Apa itu logging ? Logging adalah salah satu cara debug program dengan menuliskan semua log aktivitas kerja program, dapat kita simpan pesan logging ke dalam file, standard output ataupun ke dalam database, sehingga akan mempermudah kita dalam melihat kesalahan program, ataupun error / bug's dari program kita.
Dalam Java, ada banyak library yang dikhususkan untuk keperluan logging ini. Salah satunya adalah log4j.
Untuk mencoba aplikasi yang dicontohkan pada artikel ini diperlukan library log4j. Pada saat artikel ini ditulis, Anda dapat mendownloadnya dari situs https://logging.apache.org/log4j/1.2/download.html. Pada screenshot tampak log4j yang tersedia adalah versi 1.2.17.
Pada artikel ini log4j yang digunakan adalah log4j 1.2.16. Namun Anda dapat menggunakan log4j yang lebih baru seperti yang ditunjukkan pada screenshot situs log4j di atas.
Setelah didownload, ekstrak file log4j hasil download tadi hingga diperoleh file log4j.x.x.xx.jar. File jar inilah yang nanti akan kita include-kan ke dalam project aplikasi yang akan kita bangun.
Pada Eclipse, buat sebuah project Java baru bernama “CobaLog4J”.
Setelah project CobaLog4J berhasil dibuat, selanjutnya adalah meng-include-kan file library log4j.x.x.xx.jar ke dalam project ini.
Klik kanan pada node CobaLog4J lalu pilih Properties.
Klik kanan pada node CobaLog4J lalu pilih Properties.
Kemudian pilih Java Build Path –> tab Libraries. Kemudian tekan tombol “Add External JARs…” yang berada di sebelah kanan tabel library.
Kemudian pilih file log4j.x.x.xx.jar yang telah kita ekstrak tadi. Lalu tekan Open.
Kini file log4j.x.x.xx.jar sudah ditambahkan ke dalam daftar library yang digunakan oleh project ini. Tekan tombol OK.
Coba perhatikan, kini pada panel Package Explorer nampak node log4j.x.x.xx.jar. Ini artinya file tersebut berhasil ditambahkan sebagai file library yang akan digunakan oleh project CobaLog4J.
Kini kita akan membuat file konfigurasi log4j yang isinya merupakan berbagai konfigurasi parameter yang menentukan perilaku log4j ketika melakukan logging. Klik kanan pada node project CobaLog4J. Kemudian pilih New –> Other…
Lalu pilih General –> File. Klik Next.
Beri nama file baru ini “log4j.properties”. Lalu tekan tombol Finish.
Kini pada Package Explorer nampak sebuah file bernama log4j.properties . File ini masih kosong. Kita akan mengedit file ini. Untuk itu pada editor, pilih tab “Source” (seperti ditunjukkan pada gambar).
Kemudian, ubah isi file log4j.properties ini menjadi seperti di bawah ini. Kemudian pilih File –> Save.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # Root logger option log4j.rootLogger=INFO, file, stdout # Direct log messages to a log file log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=log/MyLog.log log4j.appender.file.MaxFileSize=5MB log4j.appender.file.MaxBackupIndex= 10 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS} %C:%L %-5p - %m%n # Direct log messages to stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS} %C:%L %-5p - %m%n |
Kini kita akan membuat sebuah kelas yang akan melakukan logging. Lakukan klik kanan pada node src, lalu pilih New –> Class.
Beri nama kelas ini dengan “PenerapanLog” dan masukkan kelas ini ke dalam package id.co.firman dengan memasukkan nilai “id.co.firman” ke dalam field Package. Tekan tombol Finish.
Ubah isi source code kelas ini menjadi seperti berikut:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| /* * @Author Firman Hidayat */ package id.co.firman; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class PenerapanLog { static Logger log = Logger.getRootLogger(); public static void main(String[] jojon) { PropertyConfigurator.configure( "log4j.properties" ); log.trace( "Ini pesan trace" ); log.debug( "Ini pesan debug" ); log.info( "Ini pesan info" ); log.warn( "Ini pesan warn" ); log.error( "Ini pesan error" ); log.fatal( "Ini pesan fatal" ); } } |
Jalankan kelas PenerapanLog ini. Hasilnya nampak pada gambar di bawah ini.
1
2
3
4
| 2014 - 07 - 10 14 : 32 : 47 : 074 id.co.firman.PenerapanLog: 17 INFO - Ini pesan info 2014 - 07 - 10 14 : 32 : 47 : 076 id.co.firman.PenerapanLog: 18 WARN - Ini pesan warn 2014 - 07 - 10 14 : 32 : 47 : 077 id.co.firman.PenerapanLog: 19 ERROR - Ini pesan error 2014 - 07 - 10 14 : 32 : 47 : 077 id.co.firman.PenerapanLog: 20 FATAL - Ini pesan fatal |
Nampak pada output di atas proses logging tidak menampilkan pesan dari method log.trace() dan log.debug(). Ini dikarenakan log level yang digunakan adalah INFO. Log level ini didefinisikan pada log4j.properties.
Selain itu tercipta pula sebuah file bernama MyLog.log di dalam direktori log. Ini adalah file log yang dihasilkan oleh proses logging. Isi file log ini sama persis dengan hasil logging pada output di console.
Kini kita perhatikan isi file log4j.properties. Ada tiga bagian utama pada file ini. Bagian paling atas adalah bagian log4j.rootLogger. Ada dua hal penting yang perlu didefinisikan pada bagian ini. Yang pertama adalah pada log level apa proses logging akan dijalankan. Pada contoh ini yang digunakan adalah log level INFO. Log level yang dapat digunakan dari level terendah hingga tertinggi adalah: ALL, TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF.
Hal kedua yang perlu didefinisikan pada rootLogger ini adalah tempat menyimpan pesan log. Ada dua tempat yang biasa digunakan untuk proses logging: file dan standar output. Seperti biasa, file akan menyimpan pesan-pesan log di dalam file sedangkan standar output akan menampilkan pesan-pesan log ke dalam standar output yang biasanya berupa layar monitor.
Dalam contoh ini digunakan dua buah tempat penyimpanan pesan log: file dan stdout. Kita perhatikan source code pada bagian file terlebih dahulu.
Log4j.appender.file. Di sini digunakan RollingFileAppender, artinya jumlah file log akan dirolling bila bila file log utama sudah dianggap penuh.
Log4j.appender.file. Nama file yang akan digunakan sebagai file log adalah “MyLog.log”. File MyLog.log ini akan berada di dalam direktori yang bernama “log” pada working direktori.
Log4j.appender.file.Max. File log akan dianggap penuh bila sudah berukuran 5MB. Bila MyLog.log sudah berukuran 5MB, maka akan dibuat file log baru yang masih kosong untuk menampung pesan log yang baru dan pesan log yang lama disimpan pada file log backup.
Log4j.appender.file.MaxBackupIndex. Bila MyLog.log sudah penuh, maka dibuatlah file log backup. Jumlah maksimal file log backup adalah 10 buah. Bila jumlah file backup melebihi nilai maksimal ini maka file backup paling tua akan dihapus sehingga file log backup tetap berjumlah 10 buah.
Log.appender.file.layout. Di sini logging akan menghasilkan pesan dengan pola penulisan tertentu.
Log4j.appender.file.layout.ConversionPattern. Di sini didefinisikan pola penulisan pesan log yang akan disimpan.
Pada bagian stdout terdapat juga konfigurasi yang kurang lebih sama dengan bagian file sebelumnya.
Log4j.appender.stdout.Target. Di sini definisikan target standar output yang akan digunakan.
Log4j.appender.stdout.layout.ConversionPattern. Sama seperti pada bagian konfigurasi file, di sini didefinisikan pola penulisan pesan logging yang akan dilakukan.
Pada kelas PenerapanLog digunakan enam buah method logging dari level terendah hingga tertinggi, yaitu: log.trace(), log.debug(), log.info(),log.warn(), log.error() dan log.fatal(). Semua method ini dapat digunakan sekaligus dalam sebuah kelas. Namun yang nantinya akan disimpan pada penyimpanan log (misalnya file log atau stdout) bergantung pada parameter logging level dalam file log4j.properties.
Berikut adalah kaitan log level pada log4j.propertis dengan method logging dalam kelas.
ALL –> pesan dari semua method log akan ditampilkan
TRACE –> pesan dari semua method trace, debug, info, warn, error, fatal akan ditampilkan.
DEBUG –> pesan dari mehtod debug, info, warn, error, fatal akan ditampilkan. Sisanya tidak ditampilkan.
INFO –> pesan dari method info, warn, error, fatal akan ditampilkan. Sisanya tidak ditampilkan.
WARN –> pesan dari method warn, error, fatal akan ditampilkan. Sisanya tidak ditampilkan.
ERROR –> pesan dari method error, fatal akan ditampilkan. Sisanya tidak ditampilkan.
FATAL –> pesan hanya method fatal yang akan ditampilkan.
OFF –> Tidak ada pesan dari method manapun yang ditampilkan.
TRACE –> pesan dari semua method trace, debug, info, warn, error, fatal akan ditampilkan.
DEBUG –> pesan dari mehtod debug, info, warn, error, fatal akan ditampilkan. Sisanya tidak ditampilkan.
INFO –> pesan dari method info, warn, error, fatal akan ditampilkan. Sisanya tidak ditampilkan.
WARN –> pesan dari method warn, error, fatal akan ditampilkan. Sisanya tidak ditampilkan.
ERROR –> pesan dari method error, fatal akan ditampilkan. Sisanya tidak ditampilkan.
FATAL –> pesan hanya method fatal yang akan ditampilkan.
OFF –> Tidak ada pesan dari method manapun yang ditampilkan.
Untuk menyimpan pesan logging ke dalam database yang perlu dilakukan adalah membuat tabel dalam database untuk menyimpan pesan logging dan mengatur konfigurasi log4j.properties dengan menambahkan parameter-parameter untuk keperluan koneksi ke database dan statement sql-nya.
Buat sebuah tabel seperti ini:
1
2
3
4
5
6
7
| CREATE TABLE LOGS (USER_ID VARCHAR (20) NOT NULL , DATED DATETIME NOT NULL , LOGGER VARCHAR (50) NOT NULL , LEVEL VARCHAR (10) NOT NULL , MESSAGE VARCHAR (1000) NOT NULL ); |
Ini contoh log4j.properties yang dikhususkan untuk menyimpan pesan logging ke dalam database.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| # Define the root logger with appender file log4j.rootLogger = DEBUG, DB # Define the DB appender log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender # Set JDBC URL log4j.appender.DB.URL=jdbc:mysql: //localhost:3306/DBNAME # Set Database Driver log4j.appender.DB.driver=com.mysql.jdbc.Driver # Set database user name and password log4j.appender.DB.user=user_name log4j.appender.DB.password=password # Set the SQL statement to be executed. log4j.appender.DB.sql=INSERT INTO LOGS VALUES( '%x' , '%d{yyyy-MM-dd HH:mm:ss}' , '%C:%L' , '%p' , '%m' ) # Define the layout for file appender log4j.appender.DB.layout=org.apache.log4j.PatternLayout |
Selain properties file, konfigurasi log4j dapat pula berupa file xml. Ini adalah contoh log4j.xml yang menyimpan pesan log ke dalam file, standard output dan database:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| <? xml version = "1.0" encoding = "UTF-8" ?> <! DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <!-- Konfigurasi appender stdout --> < appender name = "stdout" class = "org.apache.log4j.ConsoleAppender" > < param name = "Target" value = "System.out" /> < layout class = "org.apache.log4j.PatternLayout" > < param name = "ConversionPattern" value = "%d{yyyy-MM-dd HH:mm:ss:SSS} %C:%L %-5p - %m%n" /> </ layout > </ appender > <!-- Konfigurasi appender file --> < appender name = "file" class = "org.apache.log4j.RollingFileAppender" > < param name = "File" value = "log/MyLog.log" /> < param name = "MaxFileSize" value = "5MB" /> < param name = "MaxBackupIndex" value = "10" /> < layout class = "org.apache.log4j.PatternLayout" > < param name = "ConversionPattern" value = "%d{yyyy-MM-dd HH:mm:ss:SSS} %C:%L %-5p - %m%n" /> </ layout > </ appender > <!-- Konfigurasi appender DB --> < appender name = "DB" class = "org.apache.log4j.jdbc.JDBCAppender" > < param name = "driver" value = "com.mysql.jdbc.Driver" /> < param name = "user" value = "user_name" /> < param name = "password" value = "password" /> < param name = "sql" value = "INSERT INTO LOGS VALUES('%x','%d{yyyy-MM-dd HH:mm:ss}','%C:%L','%p','%m')" /> </ appender > <!-- rootLogger --> < root > < priority value = "debug" /> < appender-ref ref = "stdout" /> < appender-ref ref = "file" /> < appender-ref ref = "DB" /> </ root > </ log4j:configuration > |
Untuk menggunakan file konfigurasi log4j.xml kelas di bawah menggunakan method DOMConfigurator.configure() seperti berikut:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| /* * @Author Firman Hidayat */ package id.co.firman; import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; public class TestLogging { static Logger log = Logger.getRootLogger(); public static void main(String[] dd) { DOMConfigurator.configure( "log4j.xml" ); log.trace( "Ini pesan TRACE" ); log.debug( "Ini pesan DEBUG" ); log.info( "Ini pesan INFO" ); log.warn( "Ini pesan WARN" ); log.error( "Ini pesan ERROR" ); log.fatal( "Ini pesan FATAL" ); } } |
Bila kelas ini dijalankan, pesan logging yang disimpan dalam database adalah seperti ini:
1
2
3
4
5
6
7
8
9
| + ---------+---------------------+-----------------------------+-------+-----------------+ | USER_ID | DATED | LOGGER | LEVEL | MESSAGE | + ---------+---------------------+-----------------------------+-------+-----------------+ | | 2014-07-12 00:16:43 | id.co.firman.TestLogging:16 | DEBUG | Ini pesan DEBUG | | | 2014-07-12 00:16:43 | id.co.firman.TestLogging:17 | INFO | Ini pesan INFO | | | 2014-07-12 00:16:43 | id.co.firman.TestLogging:18 | WARN | Ini pesan WARN | | | 2014-07-12 00:16:43 | id.co.firman.TestLogging:19 | ERROR | Ini pesan ERROR | | | 2014-07-12 00:16:43 | id.co.firman.TestLogging:20 | FATAL | Ini pesan FATAL | + ---------+---------------------+-----------------------------+-------+-----------------+ |
No comments:
Post a Comment