log4j 配合 tomcat

八月 24, 2007

想要在 tomcat 中把 log4j 用在自己的程式中,用下列的安裝方式:
1.下載 log4j, 把 log4j.jar 放在自己專案的 WEB-INF/lib 目錄中
2.寫一個 log4j.properties 放在 WEB-INF/classes 中,參考內容如下:

log4j.rootLogger=debug, R
#log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.MaxFileSize=512KB
log4j.appender.R.MaxBackupIndex=3
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
log4j.appender.R.File=C:/logs/log.txt

log4j.appender.R.File 是log 檔的路徑和檔名

可以參考 Short introduction to log4j 中的方式,寫一個 servlet 程式,用來載入 log4j.properties 設定好 log4j 的參數:

import org.apache.log4j.PropertyConfigurator;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.io.IOException;

public class Log4jInit extends HttpServlet {

  public
  void init() {
    String prefix =  getServletContext().getRealPath("/");
    String file = getInitParameter("log4j-init-file");
    // if the log4j-init-file is not set, then no point in trying
    if(file != null) {
      PropertyConfigurator.configure(prefix+file);
    }
  }

  public
  void doGet(HttpServletRequest req, HttpServletResponse res) {
  }
}

另外在 web.xml 中加上 servlet 的 tag

  <servlet>
    <servlet-name>log4j-init</servlet-name>
    <servlet-class>Log4jInit</servlet-class>

    <init-param>
      <param-name>log4j-init-file</param-name>
      <param-value>WEB-INF/classes/log4j.properties</param-value>
    </init-param>

    <load-on-startup>1</load-on-startup>
  </servlet>

log4j 輸出 stack trace

八月 24, 2007

程式 debug 的時候,還是 stack trace 的 output 最有用了~~

昨天在 debug 一支 jsp 的程式,弄了很久,發現錯誤是 java 的 NullPointerException 但是又因為那個程式的 System.out.println() 沒辦法顯示在伺服器的畫面上,搞了半天,還是找不到是程式的哪一行出錯,要是可以印出 stack trace 就可以馬上知道是程式的哪一行錯誤了…

今天找了一下相關的資料,發現可以配合 log4j 來輸出 stack trace,用:

try {
    .....
} catch(Exception ex) {
    logger.debug("Exception", ex)
}

再設定好 log4j.properties 檔案,輸出資料到另一個文字 log 檔中,就可以方便的進行 debug。

另外,也可以另外寫一個 ExceptionUtil 來把 stack trace 的輸出轉成一個文字字串,方便進行處理。

public class ExceptionUtil {
    public static String getStackTrace(Throwable t) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        t.printStackTrace(pw);
        pw.flush();
        return sw.toString();
    }
}

參考的資料:
Logging stack trace in log4j
Short introduction to log4j


bash 在終端機上換行的問題

八月 24, 2007

在我自己常使用的伺服器上,我個人的命令提示符號會經由更改原本的設定檔,加上顏色,方便在畫面上辨識,看起來也比較好看(這是我自己覺得的啦!)

有時候會發現在使用的時候,如果打的是很長的命令,會有換行不正常的情況,例如:

root@localhoat> dddddddddddddddddddddddddddddddd

若繼續打字下去,會變成:

dddddddddddat> dddddddddddddddddddddddddddddddd

可以注意到的是,第一行最前方的提示字元被蓋住了,而且也沒有正常的換行,正常的應該是:

root@localhoat> dddddddddddddddddddddddddddddddd
ddddddddddd

我在網路上找到了The Non-Annoying Terminal Mini How-To & Fun with shopt 這篇文章,提到 bash 的 line-wrap 問題,可以使用

shopt -s checkwinsize

打開 checkwinsize 的功能,但是我試了之後,發現我的是同一篇文章中後半段網友提到的,是由於設定 PS1 變數所產生的問題。
在使用 escape 字元設定提示符號的顯示顏色時,要在色碼的前後加上 \[ \] 才不會導致 bash 計算視窗寬度產生錯誤,進而發生換行錯誤。

在修改了我自己的PS1設定檔案之後,我的換行問題就解決了。