Tool-tools development untuk bahasa Java banyak yang menyediakan fitur debugging, yang mana sangat berguna untuk pengembangan. Namun kadang-kadang, fitur debugging itu tidak dapat digunakan seperti semestinya. Hal ini terjadi ketika misalnya kita hendak men-debug plugin. Nadamar tidak mengetahui contoh lainnya, mungkin pembaca bisa memberikan masukkan, hehe.
Namun proses debugging tetap perlu dilakukan. Setelah bingung2 harus bagaimana, akhirnya Nadamar diperkenalkan dengan teknik logging. Logging sebenarnya tidak jauh berbeda dengan misalnya ngeprint suatu variabel dengan nilainya ke layar, hanya saja ini dituliskan ke dalam file. Namun ternyata teknik logging ini bisa lebih dari sekedar itu apabila digunakan dengan benar. Bos Nadamar menunjukkan bagaimana teknik ini dapat digunakan untuk mengetahui letak bug dengan cepat.
Java sendiri telah menyediakan kelas-kelas untuk keperluan logging, namun karena Nadamar kurang paham penggunaannya, Nadamar memutuskan untuk membungkus java.util.logging.* sesuai kebutuhan Nadamar.
import java.io.IOException;
import java.text.*;
import java.util.Calendar;
import java.util.logging.*;
public class SimpleLog {
private static SimpleLog mSingleton = new SimpleLog();
private Logger mLogger;
private SimpleLog() {
try {
mLogger = Logger.getLogger("logger");
mLogger.setUseParentHandlers(false);
FileHandler tHandler = new FileHandler("log.txt",true);
tHandler.setFormatter(new SimpleLogFormatter());
mLogger.addHandler(tHandler);
} catch(IOException ex) {
//no comment..
}
}
public Logger getLogger() { return mLogger; }
public static void write
(
Level pLevel, String pMessage,
String pClassName, String pMethodName,
Throwable pThrowable
)
{
LogRecord tRecord = new LogRecord(pLevel, pMessage);
tRecord.setSourceClassName(pClassName);
tRecord.setSourceMethodName(pMethodName);
tRecord.setThrown(pThrowable);
mSingleton.getLogger().log(tRecord);
}
public static void main(String [] args) {
String string = null;
try{
string.substring(3, 4);
}catch(NullPointerException e) {
SimpleLog.write(Level.SEVERE, "trying to substring variabel string", "SimpleLog", "main", e);
}
}
}
class SimpleLogFormatter extends Formatter {
private void appendDate(StringBuffer sb) {
SimpleDateFormat t_SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
FieldPosition t_FieldPosition = new FieldPosition(NumberFormat.INTEGER_FIELD);
t_SimpleDateFormat.format(Calendar.getInstance().getTime(), sb, t_FieldPosition);
}
@Override
public String format(LogRecord record) {
StringBuffer sb = new StringBuffer();
sb.append("[");
appendDate(sb);
sb.append("]");
if (record.getSourceClassName() != null) {
sb.append("[Class: ");
sb.append( record.getSourceClassName());
sb.append(" ]");
}
if (record.getSourceMethodName() != null) {
sb.append("[Method: ");
sb.append(record.getSourceMethodName());
sb.append(" ]");
}
if (record.getMessage() != null) {
String message = formatMessage(record);
sb.append(" ");
sb.append(message);
}
if (record.getThrown() != null) {
Throwable th = record.getThrown();
sb.append("\n [Exception");
sb.append(" : ");
sb.append(th.toString());
sb.append("]");
StackTraceElement trace[] = th.getStackTrace();
for (int i = 0; i < trace.length; i++) {
StackTraceElement frame = trace[i];
sb.append("\n [stack trace:");
sb.append("(");
sb.append(frame.getClassName());
sb.append(":");
sb.append(frame.getMethodName());
if (frame.getLineNumber() >= 0) {
sb.append(":");
sb.append(frame.getLineNumber());
}
sb.append(")]");
}
}
sb.append("\n");
return sb.toString();
}
}
panjang juga ya ternyata, hehe. Source diatas bisa langsung dicopy ke file SimpleLog.java, compile dan jalankan. Setelah selesai jalan, di folder yang sama akan muncul file log.txt yang akan berisi:
[2008-04-10 11:53:25][Class: SimpleLog ][Method: main ] trying to substring variabel string
[Exception : java.lang.NullPointerException]
[stack trace:(common.log.SimpleLog:main:56)]
di file tersebut terdapat 2 kelas, yaitu SimpleLog untuk loggingnya, dan SimpleLogFormatter untuk format text log yang akan tertulis. Nadamar sadar mungkin banyak tool-tool canggih diluar sana untuk keperluan logging, ini hanya contoh sederhana. Tapi contoh diatas tersebut, sudah cukup untuk keperluang logging Nadamar, hehe. Semoga bermanfaat.